Log4j2为什么要在log4j上使用它?
我一定错过了一些东西,但我现在已经看了几天了,但为什么你会在log4j上使用log4j2(性能除外)?
从我到目前为止看到的,log4j2被宣传为更简单的配置,但它实际上非常复杂(现在已经三天了,我仍然无法在我的主目录中写日志)。 自动配置对我来说根本不起作用(或者至少我不能使它工作),配置文件本身的结构要复杂得多,并且在运行时添加内容以帮助诊断似乎更难。
所以除了性能之外还有什么理由使用log4j2而不是原始的log4j?
从Log4j 1.x升级到Log4j 2的原因
- 社区支持:Log4j 1.x未得到主动维护,而Log4j 2有一个活跃的社区,可以回答问题,添加function并修复错误。 更新:自2015年8月起, Log4j 1.x正式停产,建议升级到Log4j 2.更新2: Log4j 1.2在Java 9中被破坏 。
- 异步记录器 – 性能类似于关闭日志记录
- 自定义日志级别
- 修改后自动重新加载其配置,而不会在重新配置时丢失日志事件。
- Java 8风格的lambda支持延迟日志记录
- 从版本2.6开始,Log4j 2是无垃圾的 (或者至少是低垃圾)
- 过滤 :基于Log事件中的上下文数据,标记,正则表达式和其他组件进行过滤。 filter可以与记录器关联。 在任何这些情况下,您都可以使用通用的Filter类。
- 插件架构 – 通过构建自定义组件轻松扩展
- 支持的API:SLF4J,Commons Logging,Log4j-1.x和java.util.logging
- Log4j 2 API与Log4j 2实现分开。 API支持的不仅仅是记录字符串:CharSequences,Objects和自定义消息 。 消息允许支持有趣和复杂的构造通过日志系统传递并被有效地操作。 用户可以自由创建自己的消息类型,并编写自定义布局,filter和查找来操纵它们。
- 并发性改进: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 API,但依赖Log4j 1.2内部的自定义可能无效。 - 版本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查找log4j 2 .xml配置文件,而不是log4j.xml配置文件
- 配置文件位置 :将其放在类路径中或使用
log4j.configurationFile
系统属性指定其路径 - 要调试配置 ,请在配置文件的开头使用
- 我建议从log4j2手册中提供的众多示例配置中的一个开始,然后一点一点地添加更多的铃声和口哨声。
如果您的问题不是上述问题之一,请显示您的配置并提供有关您遇到的问题的更多详细信息。 (不确定您对自动配置的期望,如果log4j2找不到配置文件,这是一个非常基本的function,可以将ERROR事件记录到控制台。这很少就足够了。)
要写入主目录,可以使用系统属性查找 ${sys:PROPERTYNAME}
。 下面是一个示例配置来演示:
${sys:user.home}/log${date:yyyyMMdd}.log %d %p [%t] %c{1.} %m%n
检查一下 。 简而言之,从链接:
Log4j 2.0介绍:
一个新的插件系统
对财产的支持
支持基于JSON的配置和自动重新加载其配置。
支持许多现有的日志记录框架,包括SLF4J,Commons Logging,Apache Flume和Log4j 1.x,并提供新的程序员API。
正如你所说,它也快得多。
缺点是:
-
log4j 2.0与log4j 1.x非常不同,并且API大多不兼容。
-
很难设置。
如果您不需要任何新function,那么使用较旧的Log4j 1.x可能会很好。