java - pattern - logback xml appender file




Logback Appender Pfad programmgesteuert festlegen (2)

Die Verwendung der Systemeigenschaften und das erneute Laden der Konfigurationsdatei scheint sauberer zu sein:

Ändern Sie die logback.xml-Datei:

<file>${log_path:-}myfile.log</file>
....
<FileNamePattern>${log_path:-}myfile.%i.log</FileNamePattern>

Dadurch wird der Standardspeicherort für das Arbeitsverzeichnis festgelegt. Dann benutze:

System.setProperty("log_path", my_log_path);

//Reload:
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
ContextInitializer ci = new ContextInitializer(lc);
lc.reset();
try {
  //I prefer autoConfig() over JoranConfigurator.doConfigure() so I wouldn't need to find the file myself.
  ci.autoConfig(); 
} catch (JoranException e) {
  // StatusPrinter will try to log this
  e.printStackTrace();
}
StatusPrinter.printInCaseOfErrorsOrWarnings(lc);

https://code.i-harness.com

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.





logback