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可能会很好。