如何覆盖log4j.properties的特定值?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何覆盖log4j.properties的特定值?相关的知识,希望对你有一定的参考价值。
我正在使用包含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提供的PropertyConfigurator从不同的文件加载多个自定义log4j设置。即使你这样做,我也不认为你可以覆盖appender的特定属性,因为如果已经加载了log4j,它将不会再次加载appender。
c)最好的方法是在应用程序启动期间以编程方式将新文件重新分配给appender。所以你应该有一段在启动期间执行的代码,它使用Logger API获取所需记录器的附加程序和重置它。
好的,一般来说,我说你的用例是在创建appender之前验证文件是否存在,你可以使用自定义配置器添加该验证检查。
Log4j将使用PropertyConfigurator加载log4j.properties。您可以定义自己的Configurator实现,该实现从Propertyconfigurator扩展并编写代码以确保appender文件位置是有效的,如果无效则将其设置为另一个。确保设置系统属性log4j.configuratorClass以告诉Log4j应该加载配置器。在这里,我认为您只需要覆盖PropertyConfigurator中的parseAppender方法。
老话题,但也许对偶然发现它的人有用。我设法以这种方式覆盖某个属性:http://aadityatiwari.com/2013/08/override-log4j-properties-at-runtime/
当然,这对您的场景没有帮助,因为您需要首先读取内存中的log4j.properties以覆盖它。
以上是关于如何覆盖log4j.properties的特定值?的主要内容,如果未能解决你的问题,请参考以下文章
如何读取jar包外的properties文件和log4j.properties
如何读取jar包外的properties文件和log4j.properties