Dynamisch Erstellen Logback Logging und Appenders

Muss ich dynamisch erstellen Logback Logging und diverse bits für Klassen, die load und reload dynamisch. Ich habe eine variable Anzahl dieser Klassen jedoch weniger als 150 alles gesagt. Performance ist ein großes Anliegen und dies ist eine highly-threaded und extrem gleichzeitige Umgebung, so dass die Idee der Verwendung von MDC ist nicht zu Fliegen, aufgrund des potenziell Tausende von anrufen ein, eine zweite, wenn die Dinge schief gehen. Ich will auch nicht direkt zu übergeben, die Holzfäller in den Klassen, ich möchte Sie nur ziehen Sie aus der Luft mit getLogger typisch ist.

Jede Klasse hat, um sich alle es Fehlermeldungen um eigene Fehler-Datei und alle die trace-Meldungen eigene trace-Datei. Beide Dateien müssen roll über Nacht. Zusätzlich, alles, was im system angemeldet hat, um am Ende in der wichtigsten system-logs zu.

Habe ich den folgenden code-snippet zu versuchen, diese Idee aus. Es SCHEINT, wie es funktionieren würde, aber die Ergebnisse sind nicht das, was ich erwarten würde. Hier ist das test-Programm ausgeführt werden können direkt:

package logbacktesting;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.filter.LevelFilter;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
import ch.qos.logback.core.spi.FilterReply;
import ch.qos.logback.core.util.StatusPrinter;
import org.slf4j.LoggerFactory;

public class Main {

    public static void main(String[] args) {

        Logger templateLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.myapp");
        LoggerContext loggerContext = templateLogger.getLoggerContext();

        String[] nameList = new String[] {"test1.class", "test2.class"};

        //Set up the pattern
        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        encoder.setContext(loggerContext);
        encoder.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
        encoder.start();

        //Spin over the names to create all the needed objects
        for(int i = 0; i < nameList.length; i++) {

            String name = nameList[i];

            //Set up the roll over policies and the name when it rolls over
            TimeBasedRollingPolicy tracePolicy = new TimeBasedRollingPolicy();
            tracePolicy.setContext( loggerContext );
            tracePolicy.setFileNamePattern( name + "-Trace-%d{yyyy-MM-dd}.log" );
            tracePolicy.setMaxHistory( 30 );

            TimeBasedRollingPolicy errorPolicy = new TimeBasedRollingPolicy();
            errorPolicy.setContext( loggerContext );
            errorPolicy.setFileNamePattern( name + "-Error-logFile.%d{yyyy-MM-dd}.log" );
            errorPolicy.setMaxHistory( 30 );

            //Set up the filters to ensure things get split as expected
            LevelFilter traceFilter = new LevelFilter();
            traceFilter.setContext( loggerContext );
            traceFilter.setLevel( Level.TRACE );
            traceFilter.setOnMatch( FilterReply.ACCEPT );
            traceFilter.setOnMismatch( FilterReply.DENY );

            LevelFilter errorFilter = new LevelFilter();
            errorFilter.setContext( loggerContext );
            errorFilter.setLevel( Level.ERROR );
            errorFilter.setOnMatch( FilterReply.ACCEPT );
            errorFilter.setOnMismatch( FilterReply.DENY );

            //Set up the trace and error appenders
            RollingFileAppender rollingFileAppenderTrace = new RollingFileAppender();
            rollingFileAppenderTrace.setContext(loggerContext);
            rollingFileAppenderTrace.setName(name + "-Trace");
            rollingFileAppenderTrace.setFile(name + "-Trace.log");
            rollingFileAppenderTrace.setEncoder(encoder);
            rollingFileAppenderTrace.setRollingPolicy( tracePolicy );
            rollingFileAppenderTrace.addFilter( traceFilter );
            tracePolicy.setParent( rollingFileAppenderTrace );

            RollingFileAppender rollingFileAppenderError = new RollingFileAppender();
            rollingFileAppenderError.setContext(loggerContext);
            rollingFileAppenderError.setName(name + "-Error");
            rollingFileAppenderError.setFile(name + "-Error.log");
            rollingFileAppenderError.setEncoder(encoder);
            rollingFileAppenderError.setRollingPolicy( errorPolicy );
            rollingFileAppenderError.addFilter( errorFilter );
            errorPolicy.setParent( rollingFileAppenderError );

            //Start everything
            tracePolicy.start();
            errorPolicy.start();
            traceFilter.start();
            errorFilter.start();
            rollingFileAppenderTrace.start();
            rollingFileAppenderError.start();

            //attach the rolling file appenders to the logger
            Logger logger = (ch.qos.logback.classic.Logger) loggerContext.getLogger(name);
            logger.addAppender(rollingFileAppenderTrace);
            logger.addAppender(rollingFileAppenderError);

        }

        StatusPrinter.print(loggerContext);

        //Test it to see what happens
        for(int i = 0; i < nameList.length; i++) {

            String name = nameList[i];

            Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(name);
            logger.error("error message" );
            logger.warn("warn message" );
            logger.info("info message" );
            logger.debug("debug message" );
            logger.trace("trace message" );
        }

        Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.myapp");
        logger.error( "generic error message ");


    }

}

Hier ist die logback.xml Datei:

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logFile.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>

</configuration>

Wenn Sie diesen code ausführen, wird es richtig log alles in die Haupt-log-Datei. Und es wird 2-trace-und 2-Fehler meldet als erwartet. Aber keine der trace-Meldungen in die trace-log-Dateien und die Fehlermeldungen werden am Ende in der class2-Fehler-Datei ist. Es wirkt wie alle 4 appenders hinzu, um den gleichen logger und nur die letzten appender Hinzugefügt werden, tatsächlich funktioniert. Ich würde gerne verstehen, was ich mache, wo hier. Danke!

Welche version von logback ist das?
Sieht sehr gut aus. Das einzige problem, ich konnte aus sehen, ein flüchtiger Blick ist, dass Sie sollen nicht zu teilen-Encoder. Sie müssen eine neue erstellen für jede Datei/RollingFileAppender.
Ah, der große Fang. Das war absolut die Probleme verursacht. Das andere Problem war, dass der root-Ebene der debug-hätte verfolgen! Vielen Dank!

InformationsquelleAutor Michael Grundvig | 2013-05-30

Schreibe einen Kommentar