2010-03-21 12 views
108

Estoy usando logback/slf4j para hacer mi registro. Quiero analizar mi archivo de registro para analizar algunos datos, así que en lugar de analizar un gran archivo grande (que consiste principalmente en declaraciones de depuración) quiero tener dos instancias de registrador que cada registro en un archivo separado; uno para análisis y uno para todos los fines de registro. ¿Alguien sabe si esto es posible con Logback, o cualquier otro registrador para ese asunto?Logback para registrar mensajes diferentes en dos archivos

Respuesta

223

Es muy posible hacer algo como esto en logback. Aquí está un ejemplo de configuración:

<?xml version="1.0"?> 
<configuration> 
    <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
     <file>logfile.log</file> 
     <append>true</append> 
     <encoder> 
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> 
     </encoder> 
    </appender> 
    <appender name="ANALYTICS-FILE" class="ch.qos.logback.core.FileAppender"> 
     <file>analytics.log</file> 
     <append>true</append> 
     <encoder> 
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> 
     </encoder> 
    </appender> 
    <!-- additivity=false ensures analytics data only goes to the analytics log --> 
    <logger name="analytics" level="DEBUG" additivity="false"> 
     <appender-ref ref="ANALYTICS-FILE"/> 
    </logger> 
    <root> 
     <appender-ref ref="FILE"/> 
    </root> 
</configuration> 

Entonces será configurar dos registradores separados, uno para cada cosa y uno para registrar los datos de análisis de este modo:

Logger analytics = LoggerFactory.getLogger("analytics"); 
+1

tengo que hacer este tipo de cosas para que yo pueda tener un appender sin línea de alimentación y una appender regular para el mismo archivo. Gracias por esta información – djangofan

+0

IMO additivity = false debe ser el valor predeterminado si se especifica diferente appender-ref. Con mucha frecuencia obtenemos aplicaciones en las que algunos módulos serán generadores de registros muy frecuentes debido a algunos eventos del temporizador, y nos gustaría separar esos registros en diferentes archivos. Iniciar sesión en el mismo registro en 10 archivos diferentes realmente no tiene sentido. Por lo tanto, debe ser una característica de aceptación no predeterminada. Como el logback fue una reescritura, el mismo error debería haber sido corregido por el mismo autor. –

+0

Quiero registrar errores, depurar, mensajes de información en diferentes archivos, respectivamente. ¿Es posible con logback.xml – Qasim

1

en mi caso quería dejar los nombres de clases como ingrese el nombre

private static final Logger log = LoggerFactory.getLogger(ScheduledPost.class); 

y como tenía pocas de estas clases, por lo que mi logbook.xml

<!--additivity=false ensures this log data only goes to the this log, and no one more --> 
<logger name="xxx.xxx.xxx.ScheduledPost" level="DEBUG" additivity="false"> 
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/> 
</logger> 
<logger name="xxx.xxx.xxx.GcmPost" level="DEBUG" additivity="false"> 
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/> 
</logger> 
<logger name="xxx.xxx.xxx.PushUtils" level="DEBUG" additivity="false"> 
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/> 
</logger> 
1

Puede tener tantos registradores como desee. Pero es mejor que tenga uno para cada paquete que necesita para registrarse de manera diferente. Entonces, todas las clases en ese paquete y sus subpaquetes obtendrán ese registrador específico. Todos pueden compartir el registrador de raíz y enviar sus datos de registro al apilador de registrador de raíz usando additivity = "true". He aquí un ejemplo:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 

<property name="pattern" value="%date{HH:mm:ss.SSS} %-5p %logger{36} 
%X{akkaSource} [%file:%line] - %m%n" /> 

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
     <pattern>%date{HH:mm:ss.SSS} %-5p %logger{36} %X{akkaSource} [%file:%line] - %m%n</pattern> 
    </encoder> 
</appender> 

<appender name="abc" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${catalina.base}/logs/worker.log</file> 
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <fileNamePattern>${catalina.base}/logs/worker-%d{yyyy-MM-dd_HH}.log</fileNamePattern> 
     <maxHistory>360</maxHistory> 
    </rollingPolicy> 
    <encoder> 
     <pattern>${pattern}</pattern> 
    </encoder> 
</appender> 

<appender name="xyz" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${catalina.base}/logs/transformer.log</file> 
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <fileNamePattern>${catalina.base}/logs/transformer-%d{yyyy-MM-dd_HH}.log</fileNamePattern> 
     <maxHistory>360</maxHistory> 
    </rollingPolicy> 
    <encoder> 
     <pattern>${pattern}</pattern> 
    </encoder> 
</appender> 

<logger name="com.xxx.yyy.zzz" level="INFO" additivity="true"> 
    <appender-ref ref="xyz"/> 
</logger> 

<logger name="com.aaa.bbb.ccc" level="INFO" additivity="true"> 
    <appender-ref ref="abc"/> 
</logger> 

<root> 
    <level value="INFO" /> 
    <appender-ref ref="STDOUT" /> 
</root> 

Cuestiones relacionadas