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

Sco*_*lle 37 java logging log4j log4j2

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

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

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

Rem*_*pma 62

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

  • 社区支持:Log4j 1.x未得到主动维护,而Log4j 2有一个活跃的社区,可以回答问题,添加功能并修复错误.更新:自2015年8月起,Log4j 1.x正式停产,建议升级到Log4j 2.更新2:Log4j 1.2在Java 9中被破坏.
  • 异步记录器 - 性能类似于关闭日志记录
  • 自定义日志级别
  • 修改后自动重新加载其配置,而不会在重新配置时丢失日志事件.
  • 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和自定义消息.消息允许支持有趣和复杂的构造通过日志系统传递并被有效地操作.用户可以自由创建自己的消息类型,并编写自定义布局,过滤器和查找来操作它们.
  • 并发性改进: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事件记录到控制台.这很少就足够了.)

要写入主目录,可以使用系统属性查找 ${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>
Run Code Online (Sandbox Code Playgroud)


Jon*_*ica 7

检查一下.简而言之,从链接:

Log4j 2.0介绍:

  • 一个新的插件系统

  • 对财产的支持

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

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

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

缺点是:

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

  • 很难设置.

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

  • 悠悠球切换很容易???在我们的项目中,我们扩展了很多类来迁移ti log4j2是一场噩梦。文档太差了。例如,Appender 不再有阈值,你怎么知道如何通过添加过滤器或其他东西来替换它,你怎么知道用什么替换?迁移步骤为 1 段。!!! (2认同)