以编程方式设置logback.xmlpath

我知道我可以像这样设置logback.xmlpath:

指定默认configuration文件的位置作为系统属性

您可以使用名为“logback.configurationFile”的系统属性指定默认configuration文件的位置。 此属性的值可以是URL,类path上的资源或应用程序外部文件的path。

java -Dlogback.configurationFile=/path/to/config.xml chapters.configuration.MyApp1 

但我怎么能在代码中做到这一点?

你可以使用:

 System.setProperty("logback.configurationFile", "/path/to/config.xml"); 

但是在加载logback之前就必须发生,比如:

 class Main { static { System.setProperty("logback.configurationFile", "/path/to/config.xml");} private final Logger LOG = LoggerFactory.getLogger(Main.class); public void main (String[] args) { ... } } 

注:我没有testing过,但它应该工作。

 LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); loggerContext.reset(); JoranConfigurator configurator = new JoranConfigurator(); InputStream configStream = FileUtils.openInputStream(logbackPropertiesUserFile); configurator.setContext(loggerContext); configurator.doConfigure(configStream); // loads logback file configStream.close(); 

修改环境variables可能并不总是可行的。 要正确地做到这一点,请参阅logback手册:

http://logback.qos.ch/manual/configuration.html#joranDirectly

我只想分享一下我在Jersey-Spring应用程序中做了什么:

 MyWebApplicationInitializer implements WebApplicationInitializer { @Override public void onStartup(final ServletContext servletContext) throws ServletException { servletContext.addListener(new LogbackConfigListener()); try { LogbackConfigurer.initLogging(servletContext.getRealPath("/WEB-INF/logback.xml")); } catch (FileNotFoundException | JoranException e) { e.printStackTrace(); } } } 

我还必须补充一点,我必须移动

 <dependency> <groupId>org.logback-extensions</groupId> <artifactId>logback-ext-spring</artifactId> <version>0.1.4</version> <scope>compile</scope></dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> <scope>compile</scope></dependency> 

从运行时(父项目在我的情况)来编译。