2012-10-31 35 views
9

想法是在不重新部署的情况下更改logback配置。 Slf4j和logback在项目中使用。 logback.xml文件在耳边,但是它从属性文件中读取一些属性,它放在耳边。 类似的东西:无需重新部署即可更新logback配置

<configuration scan="true" scanPeriod="5 seconds"> 
<property file="${logconfig}"/> 

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
     <pattern>${logback.consolePattern}</pattern> 
    </encoder> 
</appender> 
<root level="DEBUG"> 
    <appender-ref ref="STDOUT" /> 
</root> 

</configuration> 

问题是,扫描检查logback.xml已更改(和文件总是相同的)。这就是为什么在属性文件中更改值不会更改logback的配置。更改仅在重新部署后应用。

那么有能力修改logback配置而不重新部署的最好方法是什么?有没有一些机制可以实现它?

upd:更改将很少发生。但他们应该尽快应用。表现也很重要。

+1

你不能做编程的一些虚拟的变化logback.xml文件,以便重新加载?像添加和删除文件末尾的空白行? – rolve

+0

@rolve 我想过这样的工作。但我希望一定有更方便的方法来做到这一点。 – error1009

回答

0

经过一番比较后,我认为将logback.xml放在耳边会更容易也更舒服。 可以通过在服务器配置中指定系统属性logback.configurationFile来实现。 为了让编辑更方便,我打算在文件的开头定义一些属性。这样

<property name="consolePattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/> 

然后在配置中使用它们

<pattern>${consolePattern}</pattern> 

它将处理问题的动态变化,它几乎是用户友好的))

5

我管理由这样做是为了重新加载它:在自动配置之前

loggerContext.putProperty("logDirectory", getLogDirectory().getAbsolutePath()); 

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); 
loggerContext.reset(); 
ContextInitializer ci = new ContextInitializer(loggerContext); 
ci.autoConfig(); 

在我的使用情况下,我这样做,边做边添加一些属性的上下文。

从属性文件读取属性也应该起作用。

+0

不幸的是,这需要应用程序代码知道日志的实现而不是接口,因为LoggerContext是一个logback类。这当然假定海报使用slf4j作为伐木外观,正如推荐的那样。 –

+0

所以你建议检查属性文件中的更改。并重新加载配置,如果财产被更改? 它应该可以工作,但我认为它不适合表演。 – error1009

3

也许命令“触摸”将用于虚拟文件修改后,属性设置。

相关问题