Logback para registrar mensagens diferentes em dois arquivos

146

Estou usando o logback / slf4j para fazer o meu log. Quero analisar meu arquivo de log para analisar alguns dados; portanto, em vez de analisar um grande arquivo grande (a maioria consistindo de instruções de depuração), quero ter duas instâncias do logger, cada uma registrando em um arquivo separado; um para análise e outro para log para todos os fins. Alguém sabe se isso é possível com o Logback, ou qualquer outro registrador para esse assunto?

Aly
fonte

Respostas:

296

É muito possível fazer algo assim no logback. Aqui está um exemplo de configuração:

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

Em seguida, você configuraria dois registradores separados, um para tudo e outro para registrar dados analíticos da seguinte forma:

Logger analytics = LoggerFactory.getLogger("analytics");
ig0774
fonte
1
Eu preciso fazer esse tipo de coisa para que eu possa ter um appender sem alimentação de linha e um appender regular para o mesmo arquivo. Obrigado por esta informação.
djangofan
Aditividade da IMO = false deve ser o padrão se appender-ref diferente for especificado. Com muita frequência, obtemos aplicativos nos quais alguns módulos serão geradores de logs muito frequentes devido a alguns eventos de timer, e gostaríamos de separar esses logs em arquivos diferentes. Registrar o mesmo log em 10 arquivos diferentes realmente não faz sentido. Portanto, deve ser um recurso de inclusão não padrão. Como o logback foi reescrito, o mesmo erro deveria ter sido corrigido pelo mesmo autor.
Samarjit samanta 23/03
Quero registrar mensagens de erro, depuração e informações em arquivos diferentes, respectivamente. É possível com logback.xml
Qasim
@ Qasim - isso é possível. Veja - amitstechblog.wordpress.com/2014/09/27/…
Andy Dufresne
Estou tentando registrar logs de pacotes diferentes para arquivos diferentes, como sugerem esta resposta, mas isso não funciona para mim. Meu extrato xml de logback está aqui - pastebin.com/Aii4f1Jk . Estou tentando registrar os logs do nível TRACE do pacote de hibernação em um arquivo diferente. Alguma sugestão?
Andy Dufresne
7

Você pode ter quantos registradores desejar. Mas é melhor você ter um para cada pacote que precise registrar de maneira diferente. Então todas as classes nesse pacote e seus subpacotes receberão o logger específico. Todos eles podem compartilhar o logger raiz e enviar seus dados para o aplicativo de logger raiz usando aditivity = "true". Aqui está um exemplo:

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

Um rato
fonte
2

no meu caso, eu queria deixar nomes de classe como nome de log

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

e como eu tinha poucas aulas, então minha 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>
panser
fonte