Iniciar sesión para registrar diferentes mensajes en dos archivos

147

Estoy usando logback / slf4j para hacer mi registro. Quiero analizar mi archivo de registro para analizar algunos datos, por lo que en lugar de analizar un gran archivo grande (que consiste principalmente en sentencias de depuración) quiero tener dos instancias de registrador que cada una registre en un archivo separado; uno para análisis y otro para registro de uso múltiple. ¿Alguien sabe si esto es posible con Logback o con cualquier otro registrador?

Aly
fuente

Respuestas:

297

Es muy posible hacer algo como esto en el inicio de sesión. Aquí hay 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>

Luego configuraría dos registradores separados, uno para todo y otro para registrar datos analíticos de la siguiente manera:

Logger analytics = LoggerFactory.getLogger("analytics");
ig0774
fuente
1
Necesito hacer este tipo de cosas para poder tener un apéndice sin alimentación de línea y un apéndice normal para el mismo archivo. Gracias por esta información
djangofan
IMO additivity = false debería ser predeterminado si se especifica appender-ref diferente. 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. Registrar el mismo registro en 10 archivos diferentes realmente no tiene sentido. Por lo tanto, debería ser una función opcional, no predeterminada. Como el inicio de sesión fue una reescritura, el mismo error debería haber sido corregido por el mismo autor.
samarjit samanta
Quiero registrar mensajes de error, depuración, información en diferentes archivos respectivamente. ¿Es posible con logback.xml
Qasim
@Qasim: eso es posible. Ver - amitstechblog.wordpress.com/2014/09/27/…
Andy Dufresne
Estoy tratando de registrar registros de diferentes paquetes en diferentes archivos como esta respuesta sugiere, pero eso no funciona para mí. Mi extracto xml de logback está aquí: pastebin.com/Aii4f1Jk . Estoy tratando de registrar los registros de nivel TRACE del paquete de hibernación en un archivo diferente. ¿Alguna sugerencia?
Andy Dufresne
7

Puede tener tantos registradores como desee. Pero, es mejor que tenga uno para cada paquete que necesite registrar de manera diferente. Entonces, todas las clases en ese paquete y sus subpaquetes obtendrán ese registrador específico. Todos pueden compartir el registrador raíz y enviar sus datos de registro al apéndice del registrador raíz usando additivity = "true". Aquí hay 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>

Una rata
fuente
2

en mi caso quería dejar los nombres de clase como nombre de registro

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

y como tenía pocas clases, mi logback.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>
analizador
fuente