无需重新部署即可更新logback配置

时间:2012-10-31 14:50:09

标签: java properties logback redeploy

想法是能够在不重新部署的情况下更改回溯配置。 Slf4j和logback用于项目中。 logback.xml文件在耳边,但它从属性文件中读取一些属性,这些属性放在耳边。 这样的事情:

<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的配置。只有在重新部署后才会应用更改。

那么在没有重新部署的情况下,有能力修改回溯配置的最佳方法是什么?是否有某种机制可以实现它?

upd:很少会发生变化。但应该尽快应用它们。表现也很重要。

3 个答案:

答案 0 :(得分:6)

我设法通过这样做重新加载它:

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

在我的用例中,我这样做是为了通过执行以下操作向上下文添加一些属性:

loggerContext.putProperty("logDirectory", getLogDirectory().getAbsolutePath());
在autoConfig之前

从属性文件中读取属性也应该有效。

答案 1 :(得分:3)

在属性设置之后,也许命令“touch”对虚拟文件修改很有用。

答案 2 :(得分:0)

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

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

然后在配置中使用它们

<pattern>${consolePattern}</pattern>

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