如何覆盖log4j.properties的特定值?

时间:2013-10-22 08:57:16

标签: java log4j

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

问题:我的自定义log4j.properties在某种程度上没有被考虑在内,甚至认为它在类路径上。 我需要更改什么才能使jar中的现有log4j保持有效,但只使用我的自定义log4j覆盖特定值?

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

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

答案 1 :(得分:0)

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

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

相关问题