log4j.properties和log4j.xml的区别

44
我被要求从属性样式配置转换为XML样式。 这个过程很简单,没有引起任何问题,我只是好奇为什么被要求这样做,所以我寻找了原因。 我发现了这篇不错的文章(超过3年但仍然是我能找到的最有信息量的),其中指向这个更老的教程。他们说:

属性可以通过属性文件或XML文件定义。

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

我检查了一下,与声明相反,发现 Log4j 首先查找属性文件,然后再查找 XML 文件。实际上,如果我将它们都放在同一个文件夹中,则输出将根据属性文件进行格式化。那么,我误解了陈述吗? 它只是错误的吗?此声明是针对log4j 1.2.14而言,而我使用的是log4j 1.2.17,log4j团队是否改变了优先级?我找不到任何相关的文档,但这将是一种奇怪的趋势反转,因为 XML 看起来是配置 log4j 的首选方式。
2个回答

27
请查看JavaDoc文档。 PropertyConfiguratorClass(log4j.properties)的文档指出:

PropertyConfigurator不处理DOMConfigurator支持的高级配置功能,例如支持自定义错误处理程序、嵌套的追加程序(如AsyncAppender)等。

因此,DOMConfigurator(log4j.xml)提供了高级选项。
此外,您可以使用提供的log4j.dtd对log4j.xml文件进行(至少简单的)有效性检查。
如果您不使用高级功能,则无需从属性更改为xml文件。
您真正应该考虑的是从log4j转换到log4j 2 beta甚至slf4j。 log4j的开发已停止,其创始人(@Ceki)发明了slf4j。

谢谢。我已经阅读了你指出的部分文档,我们需要使用AsyncAppender进行迁移。另外,我们也在评估slf4j,但是我们将继续使用log4j(项目非常庞大,到目前为止log4j已经足够满足我们的需求)。 - ThanksForAllTheFish
3
但是,sl4j只是一个外观,它不是一个日志记录框架,因此您不能从log4j更改为sl4j,但可以在其之上添加它。sl4j的威力在于它允许您通过仅更改一个jar文件来切换不同的日志记录框架。这是一个抽象层,因此,如果您包含使用不同日志记录框架的不同库或工具,只要它们使用slf4j共享配置,它们就可以共存。 - raspacorp

2
根据FrVaBe的回答,PropertyConfigurator类无法处理XML可以支持的高级功能。
值得注意的是,在log4j.xml中,更有用的高级选项之一是使用LevelMatchFilter和DenyAllFilter过滤特定日志级别或日志级别范围的能力。
一个很好的例子可以在这里看到。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接