Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何覆盖log4j.properties的特定值?_Java_Log4j - Fatal编程技术网

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

Java 如何覆盖log4j.properties的特定值?,java,log4j,Java,Log4j,我使用的jar包含log4j.properties。这个jar的一个属性映射到一个静态本地资源,其路径在我的系统上当然不存在 问题:我的自定义log4j.properties不知何故没有被考虑,即使它在类路径上。 我必须做什么更改才能使jar中现有的log4j保持有效,但只有一个特定的值被我的自定义log4j覆盖 log4j.appender.InfoFileAppender.File=d:/logs/info.log首先,log4j应该在大多数情况下为您创建新文件。如果不能,请阅读下面的内容

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

问题:我的自定义log4j.properties不知何故没有被考虑,即使它在类路径上。 我必须做什么更改才能使jar中现有的log4j保持有效,但只有一个特定的值被我的自定义log4j覆盖


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

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

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

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

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

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

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

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

这是一个老话题,但对于偶然发现它的其他人可能有用。我通过以下方式覆盖了某个属性:


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

您可以显示
log4j.properties
文件内容并指出有问题的行吗?jar使用
log4j.appender
中的属性在我的机器上没有的位置创建文件。您可以获得有关为什么创建文件的其他信息添加
-Dlog4j.debug=true
参数时不考虑。