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

问题描述 投票:1回答:2

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

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

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

java log4j
2个回答
2
投票

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

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

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

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

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

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

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


0
投票

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

当然,这对您的场景没有帮助,因为您需要首先读取内存中的log4j.properties以覆盖它。

© www.soinside.com 2019 - 2024. All rights reserved.