2009-09-03 49 views
98

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

¿Es posible hacerlo con log4net?

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

+3

No puede iniciar sesión en appenders por separado: necesita configurar diferentes registradores y adjuntar el appender adecuado a cada uno. Luego, registre diferentes mensajes en los diferentes registradores. –

+0

Así es como lo hice con el código como configuración: http://stackoverflow.com/questions/27846157/configure-log4net-to-write-to-different-log-files-no-config-files –

Respuesta

67

Sí, simplemente agregue varios 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> 
+2

Nice .. :) sin embargo, tendré que escribir mensajes por separado para cada archivo de registro. ¿cómo puedo escribir un mensaje a un appender específico? gracias. ofer – ofer

+2

@ ofer- ver mi respuesta sobre cómo hacer eso. – RichardOD

+0

¿Qué sucede si quiere que File1Appender registre errores DEBUG y File2Appender para registrar errores de ERROR? – JsonStatham

51

Vinay es correcto. En respuesta a su comentario en su respuesta, de una manera que puede hacerlo es el siguiente:

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

Esto es como lo he hecho en el pasado. Entonces algo como esto para el otro registro:

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

Y usted puede conseguir su registrador normal de la siguiente manera:

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

Leer la sección loggers and appenders de la documentación para entender cómo funciona esto.

+3

Tengo esta * misma * configuración en una de mis aplicaciones y no funciona para mí :( –

+0

Gracias, funcionó como un encanto. – VoodooChild

+0

Esta discusión es muy antigua ... espero que pueda responder ... Intenté su enfoque pero los dos registradores registran los mismos mensajes. Como en log.Info ("") y otherLog .Info ("") escribe mensajes en los dos archivos de registro simultáneamente. – SutharMonil

145

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á "procesamiento" ... y \ SummaryFile.log contendrá "Processing2"

+41

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. –

+1

Este es un gran ejemplo del poder de log4net. ¡Gracias! – crush

+1

muchas gracias, por usted – Zaragon

33

yo quería para registrar todos los mensajes al registrador de la raíz, y para tener un registro separado con errores, aquí es cómo 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.

0

uso por debajo de configuración XML para configurar los 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> 

Por encima de los registros de configuración XML en dos archivos diferentes.

Para obtener instancia específica de registrador de programación,

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

puede añadir dos o más elementos appender dentro log4net elemento raíz para iniciar sesión en múltiples archivos.

Más información sobre la estructura de configuración XML anterior, o que appender es mejor para su aplicación, Read detalle desde abajo enlace,

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

Esperamos que esto ayude.

Cuestiones relacionadas