log4j: journaliser la sortie d'une classe spécifique vers un appender spécifique

161

J'utilise log4j et je souhaite acheminer la sortie de certains enregistreurs vers des fichiers spécifiques.

J'ai déjà plusieurs appenders en place. Maintenant, pour faciliter le débogage, je veux dire à log4j que la sortie générée par une classe spécifique (par exemple foo.bar.Baz) doit être écrite dans un fichier journal spécifique.

Cela peut-il être fait?

gubrutz
la source

Réponses:

203

Un exemple:

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
la source
21
ahh - aussi simple que cela! Merci! Le paramètre log4j.additivity.foo.bar.Baz = false impose-t-il que la sortie de Baz n'apparaisse pas dans l'appender du rootLogger?
gubrutz
3
à quelle version de log4J s'agit-il? J'essaie de trouver la configuration xml pour faire la même chose pour log4j version 1.2.17
AC
1
@RodrigoGurgel oui, rien d'inhabituel là
Maurice Perry
4
@dwjohnston définissant l'additivité sur false empêchera l'enregistreur de se connecter aux appenders de ses ancêtres (c'est vrai par défaut), Dans ce cas, si l'additivité avait été laissée à true, la journalisation dans l'appender Baz aurait écrit dans les deux fichiers.
Maurice Perry
1
des pensées sur la configuration xml?
Igor Donin
21

Voici une réponse concernant la configuration XML, notez que si vous ne donnez pas au fichier appender, ConversionPatternil créera un fichier de 0 octet et n'écrira rien:

<?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
la source
2
il est essentiel de supprimer <appender-ref ref="bdfile"/>de <root>- sinon vous verrez tout votre journal copié dans ce fichier également.
sab
comment configurer cela pour pacakge par défaut ou pour une classe spécifique sans package?
Prasad Jadhav
C'est l' <logger>...élément. Spécifiez la classe ou le package comme nom et l'appender comme appender de fichier.
mikeb