2013-10-22 51 views
0

我正在使用包含log4j.properties的jar。这个jar的一个属性映射到一个静态的本地资源,其路径在我的系统当然不存在。如何覆盖log4j.properties的特定值?

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

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

+0

你可以显示'log4j.properties'文件内容并指出有问题的行吗? –

+0

来自'log4j.appender'的属性,该jar用于在我的机器上没有的位置创建文件 – membersound

+0

您可以通过添加'-Dlog4j.debug ='来获得有关不考虑文件的原因的其他信息。 true“参数。 –

回答

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应该加载Configurator。在这里我认为你只需要从PropertyConfigurator中覆盖parseAppender方法。