log4j: Protokolliert die Ausgabe einer bestimmten Klasse an einen bestimmten Appender

161

Ich verwende log4j und möchte die Ausgabe bestimmter Logger an bestimmte Dateien weiterleiten.

Ich habe bereits mehrere Appender eingerichtet. Um das Debuggen zu vereinfachen, möchte ich log4j mitteilen, dass die von einer bestimmten Klasse (z. B. foo.bar.Baz) generierte Ausgabe in eine bestimmte Protokolldatei geschrieben werden soll.

Kann das gemacht werden?

Gubrutz
quelle

Antworten:

203

Ein Beispiel:

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
quelle
21
ahh - so einfach! Vielen Dank! Erzwingt die Einstellung log4j.additivity.foo.bar.Baz = false, dass die Ausgabe von Baz nicht im Appender des rootLogger angezeigt wird?
Gubrutz
3
Für welche Version von log4J ist das? Ich versuche, die XML-Konfiguration zu finden, um dasselbe für log4j Version 1.2.17
AC
1
@ RodrigoGurgel ja, nichts Ungewöhnliches dort
Maurice Perry
4
@dwjohnston Wenn Sie die Additivität auf false setzen, wird verhindert, dass sich der Logger bei den Appendern seiner Vorfahren anmeldet (standardmäßig true). Wäre die Additivität auf true belassen worden, hätte die Protokollierung beim Baz-Appender in beide Dateien geschrieben.
Maurice Perry
1
Irgendwelche Gedanken zur XML-Konfiguration?
Igor Donin
21

Hier ist eine Antwort bezüglich der XML-Konfiguration. Beachten Sie, dass, wenn Sie dem Datei-Appender keine geben, eine ConversionPattern0-Byte-Datei erstellt und nichts geschrieben wird:

<?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
quelle
2
Es ist wichtig, <appender-ref ref="bdfile"/>aus zu entfernen. <root>Andernfalls wird auch Ihr gesamtes Protokoll in diese Datei kopiert.
Sab
Wie konfiguriere ich dies für das Standardpaket oder für eine bestimmte Klasse ohne Paket?
Prasad Jadhav
Es ist das <logger>...Element. Geben Sie die Klasse oder das Paket als Namen und den Appender als Datei-Appender an.
Mikeb