it-swarm.com.de

Zurückmelden, um verschiedene Nachrichten in zwei Dateien zu protokollieren

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

135
Aly

Es ist sehr gut möglich, so etwas in Logback zu machen. 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, um Analysedaten wie folgt zu protokollieren:

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

Sie können so viele Logger haben, wie Sie möchten. Es ist jedoch besser, für jedes Paket eines zu haben, das Sie anders protokollieren müssen. Dann erhalten alle Klassen in diesem Paket und seinen Unterpaketen den entsprechenden 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>
3
AraT

in meinem Fall wollte ich Klassennamen als Protokollnamen belassen

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

und wie ich wenige solcher Klassen hatte, so mein 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>
2
panser