从 Log4j 1.x 升级到 Log4j 2 的原因
更新:自2015年8月起,Log4j 1.x正式停产,建议升级到Log4j 2。更新2:Log4j 1.2在Java 9中损坏。
- 社区支持:Log4j 1.x没有主动维护,而Log4j 2有一个活跃的社区,在那里回答问题,添加功能并修复错误。
-
异步记录器 - 性能类似于关闭日志记录
- 自定义日志级别
- 在修改时自动重新加载其配置,而不会在重新配置时丢失日志事件。
- Java 8 风格的 lambda 支持惰性日志记录
- Log4j 2 自版本 2.6 起是无垃圾的(或至少是低垃圾)
-
筛选:根据 Log 事件中的上下文数据、标记、正则表达式和其他组件进行筛选。筛选器可以与记录器相关联。在上述任何一种情况下,都可以使用通用 Filter 类。
-
插件架构 - 通过构建自定义组件轻松扩展
- 支持的 API:SLF4J、Commons Logging、Log4j-1.x 和 java.util.logging
- Log4j 2 API 独立于 Log4j 2 实现。API 支持的功能不仅仅是记录字符串:字符序列、对象和自定义消息。消息允许通过日志记录系统传递对有趣和复杂构造的支持,并对其进行有效操作。用户可以自由创建自己的消息类型,并编写自定义布局,过滤器和查找来操作它们。
- 并发改进:log4j2 使用 java.util.concurrent 库在尽可能低的级别执行锁定。Log4j-1.x 存在已知的死锁问题。
- 通过 XML、JSON、YAML、属性配置文件或以编程方式进行配置。
注意
- log4j2.xml 和 log4j2.properties 格式与 Log4j 1.2 配置语法不同
- Log4j 2 与 Log4j 1.x 不完全兼容:适配器支持 Log4j 1.2 API,但依赖于 Log4j 1.2 内部的自定义可能不起作用。
log4j-1.2-api
- 版本 2.0 到 2.3 需要 Java 6。Log4j 2.4 及更高版本需要 Java 7。
升级时的提示
人们在开始使用log4j2时遇到的常见问题:
- 在类路径中,您至少需要 log4j-api-2.6.2.jar 和 log4j-core-2.6.2.jar
- Log4j2 查找 log4j2.xml 配置文件,而不是 log4j.xml 配置文件
- 配置文件位置:将其放在类路径中或使用系统属性指定其路径
log4j.configurationFile
- 要调试配置,请在配置文件的开头使用
<Configuration status="trace">
- 我建议从log4j2手册中提供的众多示例配置之一开始,然后一点一点地添加更多花里胡哨的东西。
如果您的问题不是上述问题之一,请显示您的配置,并提供有关您遇到的问题的更多详细信息。(不确定您对自动配置的期望,这是一个非常基本的功能,如果log4j2找不到配置文件,它将ERR事件记录到控制台。这很少足够。
要写入主目录,可以使用系统属性查找 。下面是一个要演示的示例配置:${sys:PROPERTYNAME}
<Configuration status="trace">
<Properties>
<Property name="logfile">${sys:user.home}/log${date:yyyyMMdd}.log</Property>
</Properties>
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%m%n"/>
</Console>
<File name="FILE" fileName="${sys:logfile}">
<PatternLayout>
<pattern>%d %p [%t] %c{1.} %m%n</pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="STDOUT" level="ERROR" />
<AppenderRef ref="FILE" />
</Root>
</Loggers>
</Configuration>