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

时间:2015-05-03 21:24:15

标签: java logging log4j log4j2

我一定错过了一些东西,但我现在已经看了几天了,但为什么你会在log4j上使用log4j2(性能除外)?

从我到目前为止看到的,log4j2被宣传为更简单的配置,但它实际上要复杂得多(现在已经三天了,而且我仍然无法在我的主目录中写日志)。自动配置对我来说根本不起作用(或者至少我不能使它工作),配置文件本身在结构上要复杂得多,并且在运行时添加内容以帮助诊断更加困难。

除了性能之外,有没有理由使用log4j2而不是原始的log4j?

2 个答案:

答案 0 :(得分:57)

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

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

请注意

  • log4j2.xml和log4j2.properties格式与Log4j 1.2配置语法不同
  • Log4j 2与{4}}不兼容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时人们遇到的常见问题:

  • 你需要(fully)你的类路径中的log4j-api-2.6.2.jar和log4j-core-2.6.2.jar
  • Log4j2查找log4j 2 .xml配置文件,而不是log4j.xml配置文件
  • 配置文件at least:要么将其放在类路径中,要么使用log4j.configurationFile系统属性指定其路径
  • location,请在配置文件的开头使用<Configuration status="trace">
  • 我建议从log4j2手册中提供的众多示例配置中的一个开始,然后一点一点地添加更多的铃声和口哨声。

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

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

答案 1 :(得分:6)

检查this。简而言之,从链接:

  

Log4j 2.0介绍:

     
      
  • 一个新的插件系统

  •   
  • 支持属性

  •   
  • 支持基于JSON的配置并自动重新加载其配置。

  •   
     

支持许多现有的日志记录框架,包括SLF4J,Commons Logging,Apache Flume和Log4j 1.x,并提供新的程序员API。

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

缺点是:

  • log4j 2.0与log4j 1.x非常不同,API大多不兼容。

  • 难以设置。

如果您不需要任何新功能,那么使用较旧的Log4j 1.x可能会很好。