在部署时覆盖log4j设置

时间:2009-11-18 12:02:43

标签: java logging log4j

对于部署在大量计算机上的应用程序,我决定使用应用程序包部署标准log4j.xml文件,以确保在任何地方都存在相同的设置:appenders,categories ,水平。

这确实有一个缺点,即在本地修改级别时,我们可能会在重新部署或使用旧设置时丢失更改。在实践中,我们唯一需要更改的是记录器级别,大部分时间是1,所以我正在寻找一种解决方案,它允许我只覆盖每次安装的级别。

如何在不更改原始log4j.xml文件的情况下覆盖log4j级别?

3 个答案:

答案 0 :(得分:2)

将环境变量log4j.configuration设置为指向外部文件。这样,如果重新部署,则不会触及或更改外部文件,因此您的配置不会丢失。

如需参考,请参阅Default Initialization Procedure section中的log4j manual

答案 1 :(得分:1)

如果您仍希望拥有共享主配置,可以考虑向应用程序添加一些内容,以便在初始化后更改Log4J记录器级别。您可以通过JMX调用这些更改,从集中源获取覆盖,或者只是定期读取本地特定于安装的覆盖文件(如果存在),具体取决于您的应用程序可以依赖的基础结构支持。

获取look at this以获取更多信息:

答案 2 :(得分:1)

我曾经通过在log4j属性文件中引入另一个间接来解决这些问题。例如指定类似

log4j.appender.CONSOLE.Threshold = %level%.

在运行时,我要做的第一件事是替换内存中的占位符,或者坚持使用默认值。这样,log4j配置在所有部署中都没有改变,包括开发人员,QA甚至生产。每个目标都有其主要的配置参数集,其中包括该级别的%占位符%。这些参数将随安装程序一起提供,或者每个用户都将主要配置保留在一边,同时拉动新版本。但是除了直接参与它的开发人员之外,log4j配置永远不会改变,没有人接触过。

可能是我的解释有点太复杂了......把它想象成一个Spring PropertyPlaceholderConfigurer并将它应用到log4j配置:)

这是一个编码,但非常简单,并解决了很多问题。