Configure Log4net para escribir en múltiples archivos

130

Me gustaría escribir el registro en 2 archivos de registro diferentes del mismo proceso.

¿Es posible hacer eso usando log4net?

Necesitaré escribir mensajes separados para cada archivo de registro. ¿Cómo puedo escribir un mensaje a un apéndice específico?

ofer
fuente
3
No puede iniciar sesión en apéndices separados: debe configurar diferentes registradores y adjuntar el apéndice apropiado a cada uno. Luego, registre diferentes mensajes en los diferentes registradores.
Vinay Sajip
Así es como lo hice con code-as-configuration: stackoverflow.com/questions/27846157/…
Jay Sullivan

Respuestas:

82

Sí, solo agregue múltiples FileAppenders a su registrador. Por ejemplo:

<log4net>
    <appender name="File1Appender" type="log4net.Appender.FileAppender">
        <file value="log-file-1.txt" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %message%newline" />
        </layout>
    </appender>
    <appender name="File2Appender" type="log4net.Appender.FileAppender">
        <file value="log-file-2.txt" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %message%newline" />
        </layout>
    </appender>

    <root>
        <level value="DEBUG" />
        <appender-ref ref="File1Appender" />
        <appender-ref ref="File2Appender" />
    </root>
</log4net>
Vinay Sajip
fuente
55
Agradable ... :) sin embargo, necesitaré escribir mensajes separados para cada archivo de registro. ¿Cómo puedo escribir un mensaje a un apéndice específico? Gracias. ofer
ofer
2
@ ofer- mira mi respuesta sobre cómo hacer eso.
RichardOD
1
¿Qué sucede si desea que File1Appender registre errores de DEPURACIÓN y File2Appender registre errores de ERROR?
JsonStatham
Estoy tratando de lograr cosas similares. Estaría encantado de poder responder a mi pregunta: stackoverflow.com/questions/24886364/…
Ashish Charan
202

Estas respuestas fueron útiles, pero quería compartir mi respuesta con la parte app.config y la parte del código c #, por lo que hay menos conjeturas para la siguiente persona.

<log4net>
  <appender name="SomeName" type="log4net.Appender.RollingFileAppender">
    <file value="c:/Console.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Composite" />
    <datePattern value="yyyyMMdd" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="1MB" />
  </appender>
  <appender name="Summary" type="log4net.Appender.FileAppender">
    <file value="SummaryFile.log" />
    <appendToFile value="true" />
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="SomeName" />
  </root>
  <logger additivity="false" name="Summary">
    <level value="DEBUG"/>
    <appender-ref ref="Summary" />
  </logger>
</log4net>

Luego en código:

ILog Log = LogManager.GetLogger("SomeName");
ILog SummaryLog = LogManager.GetLogger("Summary");
Log.DebugFormat("Processing");
SummaryLog.DebugFormat("Processing2"));

Aquí c: /Console.txt contendrá "Processing" ... y \ SummaryFile.log contendrá "Processing2"

Gary
fuente
58
Solo quería llamar la atención sobre el atributo additivity = "false" en el registrador que evita que todo se registre en la raíz.
Jason Hernández el
1
Este es un gran ejemplo del poder de log4net. ¡Gracias!
aplastar
55
Falta la configuración anterior <layout> ... </layout>, sin ella no vi ningún mensaje en el archivo de registro.
CrnaStena
@CrnaStena ¿Estás seguro de que ese es el único cambio que hiciste?
Gary
1
@Craig Vea esta pregunta para obtener más información sobre el uso de eso: stackoverflow.com/questions/1999382/…
Gary
60

Vinay está en lo correcto. En respuesta a su comentario en su respuesta, una forma de hacerlo es la siguiente:

<root>
    <level value="ALL" />
    <appender-ref ref="File1Appender" />
</root>
<logger name="SomeName">
    <level value="ALL" />
    <appender-ref ref="File1Appender2" />
</logger>

Así es como lo hice en el pasado. Entonces algo como esto para el otro registro:

private static readonly ILog otherLog = LogManager.GetLogger("SomeName");

Y puede obtener su registrador normal de la siguiente manera:

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

Lea la sección de registradores y anexos de la documentación para comprender cómo funciona esto.

RichardOD
fuente
3
Tengo esta misma configuración en una de mis aplicaciones y no funciona para mí :(
Román
1
Esta discusión es muy antigua ... espero que puedan responder ... Intenté su enfoque pero los dos registradores registran los mismos mensajes. Como en log.Info ("") y otherLog.Info (""), escriba mensajes en ambos archivos de registro simultáneamente.
SutharMonil
1
@daniel_aren Sí, lo que hice fue usar el bloque de apéndices para crear dos apéndices con rutas de archivo separadas (como la que está arriba de esta) ... así que efectivamente tenemos dos bloques de apéndices con nombres: fileappender1 y fileappender2 ... .
SutharMonil
1
@SutharMonil simplemente agrega 'additivity = "false" al nodo del registrador, como en la respuesta de Gary y resaltado por Jason Hernández. En este caso, seguirá poniendo todos los mensajes en la raíz, pero solo aparecerán los mensajes de otherLog.Info ("") en File1Appender2
freedomn-m
Con mucho, la respuesta más precisa.
Fabricio
41

Quería registrar todos los mensajes en el registrador raíz y tener un registro separado con errores, así es como se puede hacer:

<log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
        <file value="allMessages.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date  %-5level %logger  - %message%newline" />
        </layout>
    </appender>

    <appender name="ErrorsFileAppender" type="log4net.Appender.FileAppender">
        <file value="errorsLog.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date  %-5level %logger  - %message%newline" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <levelMin value="ERROR" />
            <levelMax value="FATAL" />
        </filter>
    </appender>

    <root>
        <level value="ALL" />
        <appender-ref ref="FileAppender" />
        <appender-ref ref="ErrorsFileAppender" />
    </root>
</log4net>

Observe el uso del elemento de filtro.

Valentin Kuzub
fuente
0

Utilice la configuración XML a continuación para configurar registros en dos o más archivos,

<log4net>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="logs\log.txt" />         
      <appendToFile value="true" /> 
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">           
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
     <appender name="RollingLogFileAppender2" type="log4net.Appender.RollingFileAppender">
      <file value="logs\log1.txt" />         
      <appendToFile value="true" /> 
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">        
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="All" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>
     <logger additivity="false" name="RollingLogFileAppender2">
    <level value="All"/>
    <appender-ref ref="RollingLogFileAppender2" />
    </logger>
  </log4net>

La configuración XML anterior se registra en dos archivos diferentes.

Para obtener una instancia específica del registrador mediante programación,

ILog logger = log4net.LogManager.GetLogger ("RollingLogFileAppender2");

Puede agregar dos o más elementos añadidos dentro del elemento raíz log4net para iniciar sesión en archivos múltiples.

Más información sobre la estructura de configuración XML anterior o qué apéndice es mejor para su aplicación. Lea los detalles en el siguiente enlace,

https://logging.apache.org/log4net/release/manual/configuration.html https://logging.apache.org/log4net/release/sdk/index.html

Espero que esto ayude.

Rakesh Chaudhari
fuente