Esegui il logback per registrare diversi messaggi su due file


147

Sto usando logback / slf4j per fare la mia registrazione. Voglio analizzare il mio file di registro per analizzare alcuni dati, quindi invece di analizzare un grande file di grandi dimensioni (costituito principalmente da istruzioni di debug) voglio avere due istanze del logger che registrano ciascuna in un file separato; uno per l'analisi e uno per la registrazione per tutti gli usi. Qualcuno sa se questo è possibile con Logback o qualsiasi altro logger per quella materia?

Risposte:


297

È molto possibile fare qualcosa del genere nel logback. Ecco un esempio di configurazione:

<?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>

Quindi imposteresti due logger separati, uno per tutto e uno per registrare i dati di analisi in questo modo:

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

1
Ho bisogno di fare questo tipo di cose in modo da poter avere un appender senza linea e un appender regolare nello stesso file. Grazie per queste informazioni
Djangofan,

L'additività IMO = false dovrebbe essere predefinita se viene specificato un riferimento appender diverso. Molto spesso riceviamo un'applicazione in cui alcuni moduli saranno generatori di log molto frequenti a causa di alcuni eventi timer e vorremmo separare quei log in file diversi. La registrazione dello stesso log in 10 file diversi non ha davvero senso. Quindi dovrebbe essere una funzione opt in non predefinita. Poiché il logback era una riscrittura, lo stesso errore avrebbe dovuto essere corretto dallo stesso autore.
Samarjit Samanta,

Voglio registrare rispettivamente errori, debug, messaggi informativi in ​​file diversi. È possibile con logback.xml
Qasim

@Qasim - questo è possibile. Vedi - amitstechblog.wordpress.com/2014/2014/09/27/…
Andy Dufresne,

Sto cercando di registrare registri da pacchetti diversi in file diversi come suggerisce questa risposta, ma non funziona per me. Il mio estratto xml di logback è qui - pastebin.com/Aii4f1Jk . Sto cercando di registrare i registri a livello di TRACE del pacchetto di ibernazione in un file diverso. Eventuali suggerimenti?
Andy Dufresne,

7

Puoi avere tutti i logger che desideri. Ma è meglio averne uno per ogni pacchetto che è necessario registrare in modo diverso. Quindi tutte le classi di quel pacchetto e dei suoi sotto-pacchetti otterranno quel logger specifico. Tutti possono condividere il logger di root e inviare i loro dati di log all'appender del logger di root usando additivity = "true". Ecco un esempio:

<?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>


2

nel mio caso volevo lasciare i nomi delle classi come nome di registro

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

e dato che avevo poche lezioni del genere, così la mia 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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.