1

我正在使用一个log4j.properties包含在内的罐子。这个 jar 的一个属性映射到一个静态本地资源,其路径在我的系统上当然不存在。

问题:我的自定义 log4j.properties 以某种方式没有被考虑在内,即使它在类路径上也是如此。我必须进行哪些更改才能使 jar 中的现有 log4j 保持有效,但我的自定义 log4j 只有一个特定值被覆盖?

log4j.appender.InfoFileAppender.File=d:/logs/info.log

4

2 回答 2

2

首先,Log4j 应该在大多数情况下为您创建新文件。如果不能,请阅读下文。

默认情况下,Log4j 会在你的类路径中加载第一个找到的“log4j.properties”。所以在你的情况下,

a) 如果要加载名称为“log4j.properties”的自定义 log4j 属性文件并进行更改,请确保它首先出现在您的类路径顺序中。

b) 您可以使用 Log4j 提供的 PropertyConfigurator 从不同的文件加载多个自定义 log4j 设置。即使你这样做,我不认为你可以覆盖附加程序的特定属性,因为如果它已经加载,log4j 不会再次加载附加程序。

c) 最好的方法是在应用程序启动期间以编程方式将新文件重新分配给 appender。因此,您应该有一段代码在启动期间执行,它使用 Logger API 获取所需记录器的 appender 和重置它。

好的,一般来说,我说您的用例是在创建附加程序之前验证文件是否存在,您可以使用自定义配置器添加该验证检查。

Log4j 将使用 PropertyConfigurator 加载您的 log4j.properties。您可以定义自己的 Configurator 实现,该实现从 Propertyconfigurator 扩展并编写代码以确保 appender 文件位置是有效的,如果无效则将其设置为不同的位置。确保您设置系统属性 log4j.configuratorClass 以告诉 Log4j 您的配置器应该被加载。在这里,我认为您只需要覆盖 PropertyConfigurator 中的 parseAppender 方法。

于 2013-10-22T17:21:04.050 回答
0

老话题,但可能对偶然发现它的其他人有用。我设法以这种方式覆盖了某个属性:http: //aadityatiwari.com/2013/08/override-log4j-properties-at-runtime/

当然,这对您的方案没有帮助,因为您需要先读取内存中的 log4j.properties 才能覆盖它。

于 2018-08-31T06:00:37.630 回答