Logback, um verschiedene Nachrichten in zwei Dateien zu protokollieren


146

Ich verwende logback / slf4j, um meine Protokollierung durchzuführen. Ich möchte meine Protokolldatei analysieren, um einige Daten zu analysieren. Anstatt eine große Datei zu analysieren (die hauptsächlich aus Debug-Anweisungen besteht), möchte ich zwei Logger-Instanzen haben, die jeweils in einer separaten Datei protokollieren. eine für die Analyse und eine für die Allzweckprotokollierung. Weiß jemand, ob dies mit Logback oder einem anderen Logger möglich ist?

Antworten:


296

Es ist sehr gut möglich, so etwas in Logback zu tun. Hier ist eine Beispielkonfiguration:

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

Dann würden Sie zwei separate Logger einrichten, einen für alles und einen zum Protokollieren von Analysedaten wie folgt:

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

1
Ich muss so etwas tun, damit ich einen Appender ohne Zeilenvorschub und einen regulären Appender für dieselbe Datei haben kann. Danke für diese Info.
Djangofan

IMO-Additivität = false sollte die Standardeinstellung sein, wenn eine andere Appender-Referenz angegeben ist. Sehr häufig erhalten wir eine Anwendung, in der einige Module aufgrund einiger Timer-Ereignisse sehr häufig Protokollgeneratoren sind, und wir möchten diese Protokolle in verschiedene Dateien aufteilen. Dasselbe Protokoll in 10 verschiedenen Dateien zu protokollieren, macht wirklich keinen Sinn. Es sollte sich also nicht um eine Opt-In-Funktion handeln. Da Logback ein Umschreiben war, sollte derselbe Fehler vom gleichen Autor korrigiert worden sein.
Samarjit Samanta

Ich möchte Fehler-, Debug- und Infomeldungen in verschiedenen Dateien protokollieren. Ist es möglich mit logback.xml
Qasim

@ Qasim - das ist möglich. Siehe - amitstechblog.wordpress.com/2014/09/27/…
Andy Dufresne

Ich versuche, Protokolle von verschiedenen Paketen in verschiedene Dateien zu protokollieren, wie diese Antwort nahe legt, aber das funktioniert bei mir nicht. Mein Logback-XML-Extrakt ist hier - pastebin.com/Aii4f1Jk . Ich versuche, Protokolle auf TRACE-Ebene im Ruhezustand in einer anderen Datei zu protokollieren. Irgendwelche Vorschläge?
Andy Dufresne

7

Sie können so viele Logger haben, wie Sie möchten. Es ist jedoch besser, wenn Sie für jedes Paket eines haben, das Sie anders protokollieren müssen. Dann erhalten alle Klassen in diesem Paket und seinen Unterpaketen den spezifischen Logger. Sie alle können den Root-Logger gemeinsam nutzen und ihre Protokolldaten mit additivity = "true" an den Root-Logger-Appender senden. Hier ist ein Beispiel:

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

In meinem Fall wollte ich Klassennamen als Protokollnamen belassen

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

und da ich nur wenige solcher Klassen hatte, so meine 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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.