java file - Logback Appender Pfad programmgesteuert festlegen




2 Answers

Nachdem Sie Ihren Appender programmgesteuert konfiguriert haben, müssen Sie seine start() -Methode aufrufen. Wenn der Appender Unterkomponenten hat, rufen Sie zuerst start() für die Unterkomponenten auf. Sie fügen dann den Appender dem Logger Ihrer Wahl hinzu.

Hier ist ein Beispiel:

import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.core.rolling.FixedWindowRollingPolicy;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy;
import ch.qos.logback.core.util.StatusPrinter;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.LoggerContext;

public class Main {
  public static void main(String[] args) {
    LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();

    RollingFileAppender rfAppender = new RollingFileAppender();
    rfAppender.setContext(loggerContext);
    rfAppender.setFile("testFile.log");
    FixedWindowRollingPolicy rollingPolicy = new FixedWindowRollingPolicy();
    rollingPolicy.setContext(loggerContext);
    // rolling policies need to know their parent
    // it's one of the rare cases, where a sub-component knows about its parent
    rollingPolicy.setParent(rfAppender);
    rollingPolicy.setFileNamePattern("testFile.%i.log.zip");
    rollingPolicy.start();

    SizeBasedTriggeringPolicy triggeringPolicy = new ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy();
    triggeringPolicy.setMaxFileSize("5MB");
    triggeringPolicy.start();

    PatternLayoutEncoder encoder = new PatternLayoutEncoder();
    encoder.setContext(loggerContext);
    encoder.setPattern("%-4relative [%thread] %-5level %logger{35} - %msg%n");
    encoder.start();

    rfAppender.setEncoder(encoder);
    rfAppender.setRollingPolicy(rollingPolicy);
    rfAppender.setTriggeringPolicy(triggeringPolicy);

    rfAppender.start();

    // attach the rolling file appender to the logger of your choice
    Logger logbackLogger = loggerContext.getLogger("Main");
    logbackLogger.addAppender(rfAppender);

    // OPTIONAL: print logback internal status messages
    StatusPrinter.print(loggerContext);

    // log something
    logbackLogger.debug("hello");
  }
}

Der obige Code ist der programmatische Ausdruck der Schritte, die der XML-Konfigurator des Logbacks, z. B. Joran, beim Parsen der Datei RollingFixedWindow.xml ausführt .

pattern level

Ich versuche, Logback appender Pfad programmgesteuert festzulegen. ( RollingFileAppender mit FixedWindowRollingPolicy um genau zu sein)

Ich mache das, weil ich meinen Benutzern ermöglichen möchte, den Protokollpfad in einem Einstellungsdialog (Eclipse RCP) zu setzen

Ich habe so etwas versucht, aber ich ändere den Protokollpfad nicht von dem, was in der Konfigurationsdatei definiert ist:

Logger logback_logger = (ch.qos.logback.classic.Logger)LoggerFactory
   .getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
RollingFileAppender<ILoggingEvent> rfappender = 
   (RollingFileAppender<ILoggingEvent>)logback_logger.getAppender("FILE");
rfappender.setFile(newFile);
FixedWindowRollingPolicy rollingPolicy = 
   (FixedWindowRollingPolicy)rfappender.getRollingPolicy();
rollingPolicy.setFileNamePattern(newPattern);



Mit Blick auf den Logback-Code habe ich eine Umgehungslösung gefunden:

rollingPolicy.stop();
rfappender.stop();
rollingPolicy.start();
rfappender.start();

Dies führt dazu, dass Logback die neuen Definitionen verwendet. Es fühlt sich jedoch immer noch wie ein Workaround an.




Related

java logging logback