Java 在不重新部署的情况下更新logback配置
这个想法是为了能够在不重新部署的情况下更改logback配置。 项目中使用了Slf4j和logback。xml文件位于ear中,但它从位于ear之外的属性文件中读取一些属性。 诸如此类:Java 在不重新部署的情况下更新logback配置,java,properties,logback,redeploy,Java,Properties,Logback,Redeploy,这个想法是为了能够在不重新部署的情况下更改logback配置。 项目中使用了Slf4j和logback。xml文件位于ear中,但它从位于ear之外的属性文件中读取一些属性。 诸如此类: <configuration scan="true" scanPeriod="5 seconds"> <property file="${logconfig}"/> <appender name="STDOUT" class="ch.qos.logback.core.Consol
<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.consolePattern}
问题是扫描检查logback.xml是否已更改(文件始终相同)。这就是为什么更改属性文件中的值不会更改logback的配置。更改仅在重新部署后应用
那么,在不重新部署的情况下修改logback配置的最佳方式是什么呢?有什么机制可以实现它吗
upd:很少会进行更改。但应尽快实施。性能也很重要。我通过执行以下操作来重新加载它:
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
loggerContext.reset();
ContextInitializer ci = new ContextInitializer(loggerContext);
ci.autoConfig();
在我的用例中,我这样做是为了通过执行以下操作向上下文添加一些属性:
loggerContext.putProperty("logDirectory", getLogDirectory().getAbsolutePath());
在自动配置之前
从属性文件中读取属性也应该可以。在设置属性后,可能命令“touch”对于虚拟文件修改很有用。经过一些比较,我认为将logback.xml放在ear之外会更容易、更舒适。 可以通过在服务器配置中指定系统属性logback.configurationFile来实现。 为了使编辑更方便人们,我计划在文件的开头定义一些属性。那样
<property name="consolePattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
然后在配置中使用它们
<pattern>${consolePattern}</pattern>
${consolePattern}
它将处理动态更改的问题,并且几乎对用户友好)您能否通过编程方式对logback.xml文件进行一些虚拟更改,以便重新加载它?比如在文件末尾添加和删除空行?@rolve我考虑过这样的解决方法。但我希望一定有更方便的方法来做这件事。谢谢你的指针@error1009。我使用了您的建议,但在运行
ci.autoConfig()之前,使用System.setProperty(ContextInitializer.CONFIG\u file\u属性,myNewLobackXmlFile.getPath())显式提供了文件遗憾的是,这需要应用程序代码知道日志的实现,而不是接口,因为LoggerContext是一个logback类。当然,这是假设海报使用slf4j作为日志外观,这是推荐的。因此,您建议检查属性文件中的更改。如果属性已更改,是否重新加载配置?这应该行得通,但我认为这不利于表现。