9

想法是能够在不重新部署的情况下更改 logback 配置。项目中使用了 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 的配置。更改仅在重新部署后应用。

那么在不重新部署的情况下修改 logback 配置的最佳方法是什么?是否有一些机制可以实现它?

upd:很少会进行更改。但应尽快应用它们。性能也很重要。

4

3 回答 3

6

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

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

在我的用例中,我这样做是为了向上下文添加一些属性:

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

在自动配置之前。

从属性文件中读取属性也应该可以。

于 2012-10-31T14:58:43.933 回答
3

在设置属性后,命令“touch”可能对虚构的文件修改有用。

于 2012-10-31T15:00:17.427 回答
0

经过一些比较,我认为将 logback.xml 放在耳边会更容易、更舒服。可以通过在服务器配置中指定系统属性 logback.configurationFile 来实现。为了方便人们进行编辑,我计划在文件开头定义一些属性。像那样

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

然后在配置中使用它们

<pattern>${consolePattern}</pattern>

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

于 2012-11-01T13:52:22.583 回答