Erstellen von logback logger programmatisch

Ich habe ein problem in Bezug auf logback-Projekt. Meine Anforderung ist, ich habe zum erstellen von log-Eigenschaften dynamisch. Lassen Sie mich erklären dies an einem Beispiel.

Mein Projekt erstellt socket-Kommunikation mit externen system und es kann mehrere sockets. Für jede Steckdose, die ich haben will, verschiedene log-Dateien, die enthalten die Nachrichten gelesen und gesendet werden. Um dies zu erreichen, erstelle ich den logger für Steckdosen programmgesteuert. Problem ist, wenn ich neu konfigurieren möchten, Holzfäller, basierend auf logback.xml (durch das hinzufügen von scan="true") oder durch eine erneute Initialisierung des logback), die Holzfäller, die ich erstellt unbrauchbar wird. Wie kann ich behoben, oder können Sie mir raten, eine andere Lösung?

Dies ist meine Konfigurationsdatei (logback.xml)

<?xml version="1.0" ?>
<configuration>
    <property name="HOME_PATH" value="/data/logs/myapp/" scope="CONTEXT" />
    <property name="MYAPP_LOG_FILE" value="myapp.log" />
    <property name="MYAPP_ROLLING_TEMPLATE" value="%d{yy-MM-dd}" scope="CONTEXT" />
    <property name="MYAPP_OLD_LOG_FILE" value="${MYAPP_LOG_FILE}.%d{yy-MM-dd}" />
    <property name="DEFAULT_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%file:%line] [%level] %msg%n" scope="CONTEXT" />

    <appender name="myAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${HOME_PATH}${MYAPP_LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${HOME_PATH}${MYAPP_LOG_FILE}.${MYAPP_ROLLING_TEMPLATE}</fileNamePattern>
        </rollingPolicy>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${DEFAULT_PATTERN}</pattern>
        </encoder>
    </appender>

    <logger name="com.myapp" level="DEBUG" additivity="false">
        <appender-ref ref="myAppender" />
    </logger>

    <root level="OFF">
    </root>
</configuration>

und hier können Sie sehen, wie ich das schaffen Logger programmatisch (wieder, ich mache das nur für den socket-Protokolle).

public static Logger createLogger(String name) {
        ch.qos.logback.classic.Logger templateLogger = (ch.qos.logback.classic.Logger) LogUtil.getLogger("com.myapp");
        LoggerContext context = templateLogger.getLoggerContext();

        String logDir = context.getProperty("HOME_PATH");

        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        encoder.setPattern(context.getProperty("DEFAULT_PATTERN"));
        encoder.setContext(context);

        DefaultTimeBasedFileNamingAndTriggeringPolicy<ILoggingEvent> timeBasedTriggeringPolicy = new DefaultTimeBasedFileNamingAndTriggeringPolicy<ILoggingEvent>();
        timeBasedTriggeringPolicy.setContext(context);

        TimeBasedRollingPolicy<ILoggingEvent> timeBasedRollingPolicy = new TimeBasedRollingPolicy<ILoggingEvent>();
        timeBasedRollingPolicy.setContext(context);
        timeBasedRollingPolicy.setFileNamePattern(logDir + name + ".log." + context.getProperty("MYAPP_ROLLING_TEMPLATE"));
        timeBasedRollingPolicy.setTimeBasedFileNamingAndTriggeringPolicy(timeBasedTriggeringPolicy);
        timeBasedTriggeringPolicy.setTimeBasedRollingPolicy(timeBasedRollingPolicy);

        RollingFileAppender<ILoggingEvent> rollingFileAppender = new RollingFileAppender<ILoggingEvent>();
        rollingFileAppender.setAppend(true);
        rollingFileAppender.setContext(context);
        rollingFileAppender.setEncoder(encoder);
        rollingFileAppender.setFile(logDir + name + ".log");
        rollingFileAppender.setName(name + "Appender");
        rollingFileAppender.setPrudent(false);
        rollingFileAppender.setRollingPolicy(timeBasedRollingPolicy);
        rollingFileAppender.setTriggeringPolicy(timeBasedTriggeringPolicy);

        timeBasedRollingPolicy.setParent(rollingFileAppender);

        encoder.start();
        timeBasedRollingPolicy.start();

        rollingFileAppender.stop();
        rollingFileAppender.start();

        ch.qos.logback.classic.Logger logbackLogger = (ch.qos.logback.classic.Logger) LogUtil.getLogger(name);
        logbackLogger.setLevel(templateLogger.getLevel());
        logbackLogger.setAdditive(false);
        logbackLogger.addAppender(rollingFileAppender);

        return logbackLogger;
}

Und dies ist, wie ich erneut initialisieren logback

private static void initializeLogback() {
    File logbackFile = new File(logFilePath);
    System.setProperty("logback.configurationFile", logbackFile.getAbsolutePath());
    StaticLoggerBinder loggerBinder = StaticLoggerBinder.getSingleton();
    LoggerContext loggerContext = (LoggerContext) loggerBinder.getLoggerFactory();

    loggerContext.reset();
    JoranConfigurator configurator = new JoranConfigurator();
    configurator.setContext(loggerContext);
    try {
        configurator.doConfigure(logbackFile);
    } catch( JoranException e ) {
        throw new ColumbusRuntimeException(e.getMessage(), e);
    }
}

InformationsquelleAutor Yusuf Soysal | 2012-01-30

Schreibe einen Kommentar