当前位置: 首页 > 面试题库 >

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

范峰
2023-03-14
问题内容

我一定会丢失一些东西,但是我已经看了几天了,但是到底为什么您会使用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>


 类似资料:
  • 问题内容: 我在网上研究过immutablejs的好处,但是没有发现任何令人满意的东西! 我的问题是,当我可以冻结一个普通的旧javascript对象时,为什么我应该使用该库并使用非本机数据结构? 问题答案: 我认为您不了解immutablejs提供的功能。这不是一个使您的对象变得不可变的库,而是一个使用不可变值的库。 在不简单重复他们的文档和任务说明的情况下,我将说明它提供的两件事: 类型。他们

  • 问题内容: 为什么要在上使用pip?难道不是PyPI和程序包作者最主要的原因吗?如果作者将废话源tarball(例如:丢失的文件,没有)上传到PyPI,则pip和都会失败。除了外观上的差异外,为什么Python的人(如上述推文中)似乎强烈青睐pip而不是? (假设我们正在谈论由社区维护的Distribute软件包中的) 问题答案: 这里的许多答案在2015年已经过时了(尽管丹尼尔·罗斯曼最初接受的

  • 问题内容: 我的用例需要一个数据结构。我应该能够将项目推送到数据结构中,而我只想从堆栈中检索最后一个项目。该堆栈的JavaDoc说: Deque接口及其实现提供了一组更完整和一致的LIFO堆栈操作,应优先使用此类。例如: 我绝对不希望这里出现同步行为,因为我将使用方法本地的数据结构。除了这个,我为什么还要在这里呢? PS:Deque的Javadoc说: 双端队列也可以用作LIFO(后进先出)堆栈。

  • 我想使用log4j2作为我的slf4j日志记录应用程序的日志记录实现。 文档说明我必须依赖于log4j-slf4j-impl和log4j-core。 我的问题是为什么log4j-slf4j-impl不依赖于log4j-core(因此带来了它绝对需要的库)?

  • 我需要一个数据结构用于我的用例。我应该能够将项目推入数据结构,并且我只想从堆栈中检索最后一个项目。JavaDoc for Stack表示:

  • 问题内容: 我们知道,双冒号()用于科特林,如获得功能(可赎回)的参考,。 在Java中,我们使用和获取类。为什么在科特林我们使用和,而不是一个函数/方法? 问题答案: 在Kotlin中,有关元编程的内容包括方法引用,属性引用和类文字。请参阅有关类文字的讨论。