Log4j2 为什么要使用它而不是 log4j?
Log4j2 why would you use it over log4j?
我一定是遗漏了一些东西,但我已经研究了几天了,但是到底为什么你会在 log4j 上使用 log4j2(性能除外)?
据我目前所见,log4j2 被宣传为配置更简单,但实际上要复杂得多(已经三天了,我仍然无法让它在我的主目录中写入日志)。自动配置对我来说根本不起作用(或者至少我不能让它工作),配置文件本身的结构要复杂得多,而且似乎更难在运行时添加东西来帮助诊断。
所以除了性能之外还有什么理由使用 log4j2 而不是原始 log4j?
勾选this。简而言之,从 link:
Log4j 2.0 introduces:
a new plugin system
support for properties
support for JSON-based configuration and automatic reloading of its configuration.
Support for many existing logging frameworks, including SLF4J, Commons Logging, Apache Flume and Log4j 1.x, and provides a new programmer’s API.
正如你所说,它也快得多。
缺点是:
log4j 2.0 与 log4j 1.x 非常不同,而且 API 大部分不兼容。
设置困难。
如果您不需要任何新功能,您可能可以使用较旧的 Log4j 1.x。
从 Log4j 1.x 升级到 Log4j 2 的原因
Update: since August 2015, Log4j 1.x is officially End of Life and it is recommended to upgrade to Log4j 2. Update 2: Log4j 1.2 is broken in Java 9.
- 社区支持:Log4j 1.x 未得到积极维护,而 Log4j 2 有一个活跃的社区,可以回答问题、添加功能并修复错误。
- Async Loggers - performance similar to logging switched off
- Custom log levels
- 修改后自动重新加载其配置,而不会在重新配置时丢失日志事件。
- Java 8-style lambda support 用于惰性日志记录
- Log4j 2 自版本 2.6
以来是 garbage-free(或至少是低垃圾)
- Filtering:根据Log事件中的上下文数据、标记、正则表达式等组件进行过滤。过滤器可以与记录器相关联。在任何这些情况下,您都可以使用通用过滤器 class。
- Plugin Architecture - 易于通过构建自定义组件进行扩展
- 支持的 APIs:SLF4J、Commons Logging、Log4j-1.x 和 java.util.logging
- Log4j 2 API 与 Log4j 2 实现分开。 API 不仅支持记录字符串:CharSequences、对象和自定义 Messages。消息允许支持有趣和复杂的构造通过日志系统传递并被有效地操作。用户可以自由创建自己的消息类型并编写自定义布局、过滤器和查找来操作它们。
- 并发改进:log4j2 使用 java.util.concurrent 库在尽可能低的级别执行锁定。 Log4j-1.x 有已知的死锁问题。
- 通过 XML、JSON、YAML、属性配置文件或以编程方式进行配置。
注意
- log4j2.xml 和 log4j2.properties 格式不同于 Log4j 1.2 配置语法
- Log4j 2 fully 与 Log4j 1.x 不兼容:
log4j-1.2-api
适配器支持 Log4j 1.2 API,但依赖于 Log4j 1.2 内部的自定义可能不行。
- Java 6 版本 2.0 到 2.3 需要。 Java Log4j 2.4 及更高版本需要 7。
升级时的提示
人们在开始使用 log4j2 时遇到的常见问题:
- 您的 class 路径中需要 (at least) log4j-api-2.6.2.jar 和 log4j-core-2.6.2.jar
- Log4j2 查找 log4j2.xml 配置文件,而不是 log4j.xml 配置文件
- 配置文件location:要么放在class路径下,要么用
log4j.configurationFile
系统指定路径属性
- 到 debug the configuration,在配置文件的开头使用
<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>
我一定是遗漏了一些东西,但我已经研究了几天了,但是到底为什么你会在 log4j 上使用 log4j2(性能除外)?
据我目前所见,log4j2 被宣传为配置更简单,但实际上要复杂得多(已经三天了,我仍然无法让它在我的主目录中写入日志)。自动配置对我来说根本不起作用(或者至少我不能让它工作),配置文件本身的结构要复杂得多,而且似乎更难在运行时添加东西来帮助诊断。
所以除了性能之外还有什么理由使用 log4j2 而不是原始 log4j?
勾选this。简而言之,从 link:
Log4j 2.0 introduces:
a new plugin system
support for properties
support for JSON-based configuration and automatic reloading of its configuration.
Support for many existing logging frameworks, including SLF4J, Commons Logging, Apache Flume and Log4j 1.x, and provides a new programmer’s API.
正如你所说,它也快得多。
缺点是:
log4j 2.0 与 log4j 1.x 非常不同,而且 API 大部分不兼容。
设置困难。
如果您不需要任何新功能,您可能可以使用较旧的 Log4j 1.x。
从 Log4j 1.x 升级到 Log4j 2 的原因
Update: since August 2015, Log4j 1.x is officially End of Life and it is recommended to upgrade to Log4j 2. Update 2: Log4j 1.2 is broken in Java 9.
- 社区支持:Log4j 1.x 未得到积极维护,而 Log4j 2 有一个活跃的社区,可以回答问题、添加功能并修复错误。
- Async Loggers - performance similar to logging switched off
- Custom log levels
- 修改后自动重新加载其配置,而不会在重新配置时丢失日志事件。
- Java 8-style lambda support 用于惰性日志记录
- Log4j 2 自版本 2.6 以来是 garbage-free(或至少是低垃圾)
- Filtering:根据Log事件中的上下文数据、标记、正则表达式等组件进行过滤。过滤器可以与记录器相关联。在任何这些情况下,您都可以使用通用过滤器 class。
- Plugin Architecture - 易于通过构建自定义组件进行扩展
- 支持的 APIs:SLF4J、Commons Logging、Log4j-1.x 和 java.util.logging
- Log4j 2 API 与 Log4j 2 实现分开。 API 不仅支持记录字符串:CharSequences、对象和自定义 Messages。消息允许支持有趣和复杂的构造通过日志系统传递并被有效地操作。用户可以自由创建自己的消息类型并编写自定义布局、过滤器和查找来操作它们。
- 并发改进:log4j2 使用 java.util.concurrent 库在尽可能低的级别执行锁定。 Log4j-1.x 有已知的死锁问题。
- 通过 XML、JSON、YAML、属性配置文件或以编程方式进行配置。
注意
- log4j2.xml 和 log4j2.properties 格式不同于 Log4j 1.2 配置语法
- Log4j 2 fully 与 Log4j 1.x 不兼容:
log4j-1.2-api
适配器支持 Log4j 1.2 API,但依赖于 Log4j 1.2 内部的自定义可能不行。 - Java 6 版本 2.0 到 2.3 需要。 Java Log4j 2.4 及更高版本需要 7。
升级时的提示
人们在开始使用 log4j2 时遇到的常见问题:
- 您的 class 路径中需要 (at least) log4j-api-2.6.2.jar 和 log4j-core-2.6.2.jar
- Log4j2 查找 log4j2.xml 配置文件,而不是 log4j.xml 配置文件
- 配置文件location:要么放在class路径下,要么用
log4j.configurationFile
系统指定路径属性 - 到 debug the configuration,在配置文件的开头使用
<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>