Pregunta

Estoy usando log4net en mi proyecto y hay un problema. La función principal del programa lleva mucho tiempo y uso el registro para guardar información al respecto. Utilizo FileAppender para guardar el registro en el archivo.

Mi aplicación está en la carpeta compartida (local) y podría haber varias instancias de la aplicación ejecutándose desde una ruta. En este caso, podría registrar información solo desde el primer programa, otras instancias de mis aplicaciones no pudieron registrar información porque el archivo de registro está bloqueado .

Cuando estoy usando la opción " log4net.Appender.FileAppender + MinimalLock " hay casos de pérdida de información. No todos los registros de ambas instancias se guardan en el archivo.

¿Cómo puedo resolver este problema y registrar información de instancias paralelas? Además, ¿qué pasa con la degradación del rendimiento cuando uso MinimalLock? opción?

Gracias. Espero su ayuda.

¿Fue útil?

Solución

Simplemente incluya la identificación del proceso de la aplicación en el nombre del archivo de registro. Diferentes instancias de su aplicación luego iniciarán sesión en diferentes archivos. Aquí hay un ejemplo:

<appender name="MyRollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString">
    <conversionPattern value="log_%processid.log" />
  </file>
<!-- ... -->

Otros consejos

Creo que es una situación típica cuando es deseable una solución de registro centralizada. En lugar de preocuparme por los archivos y sufrir cuellos de botella en el rendimiento, prefiero bombear declaraciones de registro de forma asíncrona a algún servicio remoto que se encargará de almacenar y manejar los registros. Eche un vistazo a este agregador de registros llamado logFaces , fue diseñado con el propósito de desacoplar las aplicaciones de la administración de sus troncos Debería funcionar con el apéndice UDP log4net estándar y dividirá sus datos de registro por aplicaciones, hosts, subprocesos, etc. mientras le permite crear archivos de registro en cualquier momento cuando realmente lo necesiten.

Divulgación : soy el autor de este producto.

¿Quizás inicie sesión en diferentes archivos de cada instancia? De lo contrario, probablemente necesitará configurar un proceso separado dedicado al registro. Cada instancia de su programa enviaría sus mensajes de registro allí y se encargaría de agregarlo al archivo. Esto podría lograrse utilizando SocketAppender, tal vez. Además, encuentro que dividir la salida del registro en mandriles usando RollingFileAppender es mucho más fácil de manejar.

Puede crear un apéndice personalizado que abra el archivo para escribir y luego lo cierre. Si llegara a un archivo bloqueado, podría pausar y volver a intentarlo un pequeño número de veces.

En el apéndice personalizado también puede abrir el archivo en modo de escritura compartida que permitiría múltiples escritores, pero esto no evitará que se fusionen piezas de líneas de registro.

Si no está escribiendo muchos datos, el mecanismo de apertura / cierre, mencionado anteriormente, es probablemente su mejor opción. Tenga en cuenta que, debido a la constante apertura y cierre del archivo, podría ver un impacto notable en el rendimiento si está registrando una gran cantidad de datos.

Un mecanismo más complicado, pero que podría proporcionar una ruta de registro de alto rendimiento: escriba un servicio de registro que reciba líneas de registro a través de TCP o UDP. El servicio sería responsable de almacenar los datos en el búfer y escribirlos en el disco. Hemos utilizado este enfoque en el pasado (no a través de Log4Net, sino como una solución general) para mejorar la eficiencia de escritura de registros.

Definitivamente considere crear diferentes archivos de registro para cada proceso, tal vez con nombres de archivo únicos generados usando una marca de tiempo.

En lugar de MinimalLock, usar InterProcessLock puede reducir la pérdida de datos en caso de que múltiples procesos accedan a un único archivo de registro.

log4net.Appender.FileAppender+InterProcessLock
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top