以编程方式设置Logback Appender路径

我正在尝试以编程方式设置Logback appender路径。 (具有FixedWindowRollingPolicy的RollingFileAppender准确)

我这样做是因为我想让我的用户在首选项对话框中设置日志路径(Eclipse RCP)

我尝试过类似的东西,但是我没有改变配置文件中定义的日志路径:

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

一旦以编程方式配置appender,您需要调用其start()方法。 如果appender具有子组件,则start()在子组件上调用start() 。 然后将appender添加到您选择的记录器中。

这是一个例子:

 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"); } } 

上面的代码是logback的XML配置器(即Joran)在解析RollingFixedWindow.xml文件时所采取的步骤的编程表达式。

使用系统属性并重新加载配置文件似乎更清晰:

更改logback.xml文件:

 ${log_path:-}myfile.log .... ${log_path:-}myfile.%i.log 

这会将默认位置设置为工作目录。 然后,使用:

 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); 

看一下Logback代码,我找到了一个解决方法:

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

这会导致Logback使用新定义。 不过,它仍然感觉像是一种解决方法。