Log4j2 为什么要使用它而不是 log4j?

Log4j2 why would you use it over log4j?

我一定是遗漏了一些东西,但我已经研究了几天了,但是到底为什么你会在 log4j 上使用 log4j2(性能除外)?

据我目前所见,log4j2 被宣传为配置更简单,但实际上要复杂得多(已经三天了,我仍然无法让它在我的主目录中写入日志)。自动配置对我来说根本不起作用(或者至少我不能让它工作),配置文件本身的结构要复杂得多,而且似乎更难在运行时添加东西来帮助诊断。

所以除了性能之外还有什么理由使用 log4j2 而不是原始 log4j?

勾选this。简而言之,从 link:

Log4j 2.0 introduces:

  • a new plugin system

  • support for properties

  • support for JSON-based configuration and automatic reloading of its configuration.

Support for many existing logging frameworks, including SLF4J, Commons Logging, Apache Flume and Log4j 1.x, and provides a new programmer’s API.

正如你所说,它也快得多。

缺点是:

  • log4j 2.0 与 log4j 1.x 非常不同,而且 API 大部分不兼容。

  • 设置困难。

如果您不需要任何新功能,您可能可以使用较旧的 Log4j 1.x。

从 Log4j 1.x 升级到 Log4j 2 的原因

Update: since August 2015, Log4j 1.x is officially End of Life and it is recommended to upgrade to Log4j 2. Update 2: Log4j 1.2 is broken in Java 9.

  • 社区支持:Log4j 1.x 未得到积极维护,而 Log4j 2 有一个活跃的社区,可以回答问题、添加功能并修复错误。
  • Async Loggers - performance similar to logging switched off
  • Custom log levels
  • 修改后自动重新加载其配置,而不会在重新配置时丢失日志事件。
  • Java 8-style lambda support 用于惰性日志记录
  • Log4j 2 自版本 2.6
  • 以来是 garbage-free(或至少是低垃圾)
  • Filtering:根据Log事件中的上下文数据、标记、正则表达式等组件进行过滤。过滤器可以与记录器相关联。在任何这些情况下,您都可以使用通用过滤器 class。
  • Plugin Architecture - 易于通过构建自定义组件进行扩展
  • 支持的 APIs:SLF4J、Commons Logging、Log4j-1.x 和 java.util.logging
  • Log4j 2 API 与 Log4j 2 实现分开。 API 不仅支持记录字符串:CharSequences、对象和自定义 Messages。消息允许支持有趣和复杂的构造通过日志系统传递并被有效地操作。用户可以自由创建自己的消息类型并编写自定义布局、过滤器和查找来操作它们。
  • 并发改进:log4j2 使用 java.util.concurrent 库在尽可能低的级别执行锁定。 Log4j-1.x 有已知的死锁问题。
  • 通过 XML、JSON、YAML、属性配置文件或以编程方式进行配置。

注意

  • log4j2.xml 和 log4j2.properties 格式不同于 Log4j 1.2 配置语法
  • Log4j 2 fully 与 Log4j 1.x 不兼容:log4j-1.2-api 适配器支持 Log4j 1.2 API,但依赖于 Log4j 1.2 内部的自定义可能不行。
  • Java 6 版本 2.0 到 2.3 需要。 Java Log4j 2.4 及更高版本需要 7。

升级时的提示

人们在开始使用 log4j2 时遇到的常见问题:

  • 您的 class 路径中需要 (at least) log4j-api-2.6.2.jar 和 log4j-core-2.6.2.jar
  • Log4j2 查找 log4j2.xml 配置文件,而不是 log4j.xml 配置文件
  • 配置文件location:要么放在class路径下,要么用log4j.configurationFile系统指定路径属性
  • debug the configuration,在配置文件的开头使用 <Configuration status="trace">
  • 我建议从 log4j2 手册中提供的众多示例配置之一开始,然后一点一点地添加更多的附加功能。

如果您的问题不是上述问题之一,请显示您的配置并提供有关您遇到的问题的更多详细信息。 (不确定你对自动配置有什么期望,这是一个非常基本的功能,如果 log4j2 找不到配置文件,它会将 ERROR 事件记录到控制台。这很少是足够的。)

要写入您的主目录,您可以使用系统 属性 lookup ${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>