Java 在部署时覆盖log4j设置

Java 在部署时覆盖log4j设置,java,logging,log4j,Java,Logging,Log4j,对于一个部署在大量机器上的应用程序,我决定在应用程序包中部署一个标准的log4j.xml文件,以确保在所有地方都有相同的设置:appender、categories、levels 这样做的缺点是,在本地修改级别时,我们可能会在重新部署或使用旧设置时丢失更改。实际上,我们唯一需要更改的是记录器级别,大多数情况下是1级,因此我正在寻找一种解决方案,允许我只覆盖每个安装的级别 如何在不更改原始log4j.xml文件的情况下覆盖log4j级别?将环境变量log4j.configuration设置为指向外

对于一个部署在大量机器上的应用程序,我决定在应用程序包中部署一个标准的
log4j.xml
文件,以确保在所有地方都有相同的设置:appender、categories、levels

这样做的缺点是,在本地修改级别时,我们可能会在重新部署或使用旧设置时丢失更改。实际上,我们唯一需要更改的是记录器级别,大多数情况下是1级,因此我正在寻找一种解决方案,允许我只覆盖每个安装的级别


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

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


作为参考,参见

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


获取更多信息:

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

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

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

可能是我的解释有点太复杂了。。。将其视为Spring PropertyPlaceHolderConfigure,并将其应用于log4j配置:)


这需要一些编码,但非常简单,可以解决很多问题。

因此,您的建议是复制文件,然后指向应用程序(暂时)我的建议是将您的log4j设置存储在应用服务器外部的目录中,这样您就不必担心在重新部署或取消部署期间丢失更改,并使用log4j.configuration环境变量告诉log4j文件的位置。没有什么“临时”的。换句话说,通过自己设置路径来覆盖默认的查找行为(webapps类路径,即WEB-INF/classes、公共应用服务器库等)。现在我明白了。我的问题是,我希望默认文件通常有一些非常小的、临时的更改。