Log4j2 为什么要在 log4j 上使用它?[已关闭]

2022-08-31 20:55:47

我一定错过了一些东西,但我已经看了几天了,但是你为什么要使用log4j2而不是log4j(除了性能)?

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

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


答案 1

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

更新:自2015年8月起,Log4j 1.x正式停产,建议升级到Log4j 2。更新2:Log4j 1.2在Java 9中损坏

  • 社区支持:Log4j 1.x没有主动维护,而Log4j 2有一个活跃的社区,在那里回答问题,添加功能并修复错误。
  • 异步记录器 - 性能类似于关闭日志记录
  • 自定义日志级别
  • 在修改时自动重新加载其配置,而不会在重新配置时丢失日志事件。
  • Java 8 风格的 lambda 支持惰性日志记录
  • Log4j 2 自版本 2.6 起是垃圾的(或至少是低垃圾)
  • 筛选:根据 Log 事件中的上下文数据、标记、正则表达式和其他组件进行筛选。筛选器可以与记录器相关联。在上述任何一种情况下,都可以使用通用 Filter 类。
  • 插件架构 - 通过构建自定义组件轻松扩展
  • 支持的 API:SLF4J、Commons Logging、Log4j-1.x 和 java.util.logging
  • Log4j 2 API 独立于 Log4j 2 实现。API 支持的功能不仅仅是记录字符串:字符序列、对象和自定义消息。消息允许通过日志记录系统传递对有趣和复杂构造的支持,并对其进行有效操作。用户可以自由创建自己的消息类型,并编写自定义布局,过滤器和查找来操作它们。
  • 并发改进: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 内部的自定义可能不起作用。log4j-1.2-api
  • 版本 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 查找 log4j2.xml 配置文件,而不是 log4j.xml 配置文件
  • 配置文件位置:将其放在类路径中或使用系统属性指定其路径log4j.configurationFile
  • 调试配置,请在配置文件的开头使用<Configuration status="trace">
  • 我建议从log4j2手册中提供的众多示例配置之一开始,然后一点一点地添加更多花里胡哨的东西。

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

要写入主目录,可以使用系统属性查找 。下面是一个要演示的示例配置:${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>

答案 2

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

Log4j 2.0 引入了:

  • 一个新的插件系统

  • 对属性的支持

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

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

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

缺点是:

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

  • 难以设置。

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


推荐