Log4j2为什么要在log4j上使用它?


问题内容

我一定会丢失一些东西,但是我已经看了几天了,但是到底为什么您会使用log4j2而不是log4j(而不是性能)?

从目前为止我所看到的,log4j2被宣传为更易于配置,但实际上却要复杂得多(现在已经三天了,我仍然无法在我的主目录中写日志)。自动配置对我根本不起作用(或者至少我无法使其工作),配置文件本身的结构实质上更复杂,在运行时添加东西以帮助诊断似乎更加困难。

因此,除了性能之外,还有什么理由要使用log4j2而非原始log4j?


问题答案:

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

更新:自2015年8月起,Log4j
1.x正式终止生命
,建议升级到Log4j2。更新2:Java
4中打破了Log4j
1.2

  • 社区支持:Log4j 1.x未得到积极维护,而Log4j 2具有活跃的社区,可以在其中回答问题,添加功能并修复错误。
  • 异步记录器 - 与关闭记录类似的性能
  • 自定义日志级别
  • 修改后自动重新加载其配置,而不会在重新配置时丢失日志事件。
  • Java 8样式的lambda支持延迟记录
  • 从2.6版开始,Log4j 2是无垃圾的(或至少是低垃圾的)
  • 过滤:根据上下文数据,标记,正则表达式和Log事件中的其他组件进行过滤。过滤器可以与记录器关联。您可以在任何这些情况下使用通用的Filter类。
  • 插件架构 -通过构建自定义组件轻松扩展
  • 支持的API:SLF4J,Commons Logging,Log4j-1.x和java.util.logging
  • Log4j 2 API与Log4j 2实现分开。API不仅仅支持记录字符串:CharSequences,Objects和custom Messages。消息允许对有趣和复杂的结构的支持通过日志系统传递并得到有效的操纵。用户可以自由创建自己的消息类型,并编写自定义布局,过滤器和查找来操纵它们。
  • 并发改进: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系统属性指定其路径
  • 调试配置,请<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>