2010-07-30 43 views
0

我们正在与我们普通的Swing应用程序捆绑的Log4j 1.2.15并加载自己的属性从文件系统中的文件在启动时:的Log4j:从它的初始化工作

import org.apache.log4j.*; 

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

在日志中,我们从客户获得输出看起来不像我们在属性文件中定义的那样,我们确信只有很少一部分人自己编辑文件。

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

+0

你是舒尔有一个PropertyConfigurator.configure(文件文件)方法?在Log4j 1.2.16 API中没有... – PeterMmm 2010-07-30 18:52:07

+0

@PeterMmm:我只是偶然发现了这种差异 - 在注意到你的评论之前。我看到的文档是1.2.16,因此它离OP的距离不远,不应该看到如此剧烈的API更改。有些事情不对,我向OP询问了解释。 – 2010-07-30 19:46:10

+0

你们都是对的,我上面的代码示例是错误的。我们使用绝对文件路径,而不是文件实例。我纠正了它。 – Mot 2010-08-02 18:54:18

回答

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系统属性的值将作为自定义配置程序的完全限定类名称。您指定的自定义配置器必须实现配置器界面。

这是,无可否认地混淆视而不见。基本上,你可以做的最简单的事情是把log4j.properties放在你的应用程序的类路径上,它会被找到。其他一切都是......精细。就个人而言,我有时会在我的main中明确地调用BasicConfigurator类,有时配置(硬编码)一些可能出现在文件中的东西......无论我的情况如何。你可以可以完全以编程的方式初始化log4j,这样会引起配置文件模拟的问题。尽管它也会使你的配置完全不够灵活。

+0

感谢您的回答,Carl。我们不会将'log4j.properties'添加到类路径中,因为安装位置通常是只读的,我觉得将我们的应用程序的设置目录(log4j.properties所在的位置)添加到类路径中感觉不错。 – Mot 2010-07-30 19:24:02

+0

我注意到你的代码片段和log4j文档之间存在差异:'PropertyConfigurator'似乎没有'configure(File)'方法!你能解释一下吗?也许可以提供一些细节? – 2010-07-30 19:42:11

+0

如果你的客户无法摆弄'log4j.properties'文件,你会没事吗?然后把它放到你的'.jar'文件的根目录下!这既是在类路径上,也是非常难以访问的。 – 2010-07-30 19:44:47