我正在使用一个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 设置。即使你这样做,我不认为你可以覆盖附加程序的特定属性,因为如果它已经加载,log4j 不会再次加载附加程序。
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 才能覆盖它。