Log4j:从它初始化自身

时间:2010-07-30 18:35:55

标签: java log4j

我们将Log4j 1.2.15与我们的普通Swing应用程序捆绑在一起,并在启动时从文件系统加载我们自己的属性文件:

import org.apache.log4j.*;

...
System.setProperty("log4j.defaultInitOverride", "true");
...
File log4jPropertiesFile = ...
PropertyConfigurator.configure(log4jPropertiesFile.getAbsolutePath());
...

在我们从客户那里得到的日志中,输出看起来不像我们在属性文件中定义的那样,我们确信不会只有极少数人自己编辑文件。

如果用户机器上某处存在另一个配置文件,Log4j是否会以某种方式覆盖我们的设置?我们如何防止使用它?

1 个答案:

答案 0 :(得分:4)

有一整段in the docs详细说明了Log4j如何初始化自己:

  

确切的默认初始化算法定义如下:

  1. 将log4j.defaultInitOverride系统属性设置为任何其他值,然后“false”将导致log4j跳过默认初始化过程(此过程)。
  2. 将资源字符串变量设置为log4j.configuration系统属性的值。指定默认初始化文件的首选方法是通过log4j.configuration系统属性。如果未定义系统属性log4j.configuration,则将字符串变量资源设置为其默认值“log4j.properties”。
  3. 尝试将资源变量转换为URL。
  4. 如果资源变量无法转换为URL,例如由于MalformedURLException,则通过调用org.apache.log4j.helpers.Loader.getResource(resource,Logger.class)从类路径中搜索资源。返回一个URL。请注意,字符串“log4j.properties”构成格式错误的URL。有关搜索位置列表,请参阅Loader.getResource(java.lang.String)。
  5. 如果找不到URL,则中止默认初始化。否则,请从URL配置log4j。 PropertyConfigurator将用于解析URL以配置log4j,除非URL以“.xml”扩展名结尾,在这种情况下将使用DOMConfigurator。您可以选择指定自定义配置程序。将log4j.configuratorClass系统属性的值作为自定义配置程序的完全限定类名。您指定的自定义配置程序必须实现Configurator接口。
  6. 诚然,这让人难以理解。基本上,您可以做的最简单的事情是将log4j.properties 放在应用程序的类路径上,然后找到它。其他一切都是......技巧。就个人而言,我有时会明确地调用BasicConfigurator中的main类,有时会配置(硬编码)一些可能出现在文件中的内容......无论我的情况如何。您可以以编程方式完全初始化log4j,这会使配置文件的问题变得没有问题。虽然它也会使你的配置完全不那么灵活。