41

我被要求从属性样式配置转移到 xml 样式。这个过程本身很简单,并没有给我带来任何麻烦,我只是好奇为什么我会被问到这个问题并寻找原因。我发现这篇不错的帖子为什么选择 XML 而不是 Log4J 配置的属性文件?(超过 3 岁,但仍然是我能找到的最丰富的信息),它指向这个更古老的教程。他们说

属性可以由属性文件或 XML 文件定义。

Log4j 查找名为 log4j.xml 的文件,然后查找名为 log4j.properties 的文件。两者都必须放在 src 文件夹中。

我检查了它,与声明相反,发现 Log4j 首先查找属性文件,然后第二次查找 xml。实际上,如果我将两者保存在同一个文件夹中,则输出将根据属性文件进行格式化。那么,我是否误解了该声明?是不是完全错了?我在 log4j 1.2.17上时已针对 log4j 1.2.14发表声明,log4j 团队是否可能更改了优先级?我找不到任何相关文档,但这将是一个奇怪的趋势反转,因为 xml 看起来是配置 log4j 的首选方式

4

2 回答 2

25

看看JavaDoc。PropertyConfiguratorClass (log4j.properties)的文档指出

PropertyConfigurator 不处理 DOMConfigurator 支持的高级配置功能,例如支持自定义 ErrorHandlers、嵌套 appender(如 AsyncAppender)等。

因此DOMConfigurator (log4j.xml) 提供了高级选项。

除此之外,您可以使用提供的log4j.dtd对 log4j.xml 文件进行(至少是简单的)有效性检查。

如果您不使用高级功能,则无需从属性更改为 xml 文件。

您真正应该考虑的是从 log4j 更改为log4j 2 beta甚至 slf4j。log4j 的开发已经停止,它的创始人 (@Ceki) 发明了 slf4j。

于 2013-01-24T09:55:11.267 回答
2

根据FrVaBe 的回答,PropertyConfigurator 类不处理 XML 可以支持的高级功能。

值得注意的是更有用的高级选项之一(仅可用 log4j.xml)是使用 LevelMatchFilter 和 DenyAllFilter 过滤特定日志级别或日志级别范围的能力

一个很好的例子可以在这里看到。

于 2015-10-29T15:11:22.380 回答