log4j: registra a saída de uma classe específica para um appender específico

161

Eu uso o log4j e gostaria de rotear a saída de determinados registradores para arquivos específicos.

Eu já tenho vários anexadores no lugar. Agora, para facilitar a depuração, quero dizer ao log4j que a saída gerada por uma classe específica (por exemplo, foo.bar.Baz) deve ser gravada em um arquivo de log específico.

Isso pode ser feito?

gubrutz
fonte

Respostas:

203

Um exemplo:

log4j.rootLogger=ERROR, logfile

log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.datePattern='-'dd'.log'
log4j.appender.logfile.File=log/radius-prod.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%-6r %d{ISO8601} %-5p %40.40c %x - %m\n

log4j.logger.foo.bar.Baz=DEBUG, myappender
log4j.additivity.foo.bar.Baz=false

log4j.appender.myappender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.myappender.datePattern='-'dd'.log'
log4j.appender.myappender.File=log/access-ext-dmz-prod.log
log4j.appender.myappender.layout=org.apache.log4j.PatternLayout
log4j.appender.myappender.layout.ConversionPattern=%-6r %d{ISO8601} %-5p %40.40c %x - %m\n
Maurice Perry
fonte
21
ahh - simples assim! Obrigado! A configuração log4j.additivity.foo.bar.Baz = false impõe que a saída do Baz não apareça no appender do rootLogger?
Gubrutz
3
qual é a versão do log4J? Estou tentando encontrar a configuração xml para fazer a mesma coisa para a versão 1.2.17 do log4j
AC
1
@RodrigoGurgel sim, nada de anormal lá
Maurice Perry
4
@dwjohnston definir aditividade como false impedirá que o criador de logs faça logon nos anexos de seus ancestrais (é verdade por padrão). Nesse caso, se a aditividade tivesse sido deixada como verdadeira, o logon no aplicativo do Baz teria gravado nos dois arquivos.
Maurice Perry
1
alguma opinião sobre a configuração xml?
Igor Donin
21

Aqui está uma resposta sobre a configuração XML, observe que, se você não der um apelido ao arquivo, ConversionPatternele criará um arquivo de 0 byte e não gravará nada:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %c{1} - %m%n"/>
        </layout>
    </appender>

    <appender name="bdfile" class="org.apache.log4j.RollingFileAppender">
        <param name="append" value="false"/>
        <param name="maxFileSize" value="1GB"/>
        <param name="maxBackupIndex" value="2"/>
        <param name="file" value="/tmp/bd.log"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %c{1} - %m%n"/>
        </layout>
    </appender>

    <logger name="com.example.mypackage" additivity="false">
        <level value="debug"/>
        <appender-ref ref="bdfile"/>
    </logger>

    <root>
        <priority value="info"/>
        <appender-ref ref="bdfile"/>
        <appender-ref ref="console"/>
    </root>

</log4j:configuration>
mikeb
fonte
2
é essencial remover <appender-ref ref="bdfile"/>do <root>- caso contrário, você também verá todo o seu log copiado para esse arquivo.
sab
como configurar isso para pacakge padrão ou para classe específica sem pacote?
Prasad Jadhav
É o <logger>...elemento. Especifique a classe ou pacote como o nome e o appender como o appender de arquivo.
Mikeb #