Log4j 1.x 已被广泛采用,并用于许多应用中。然而,经过多年的发展,它的发展已经放缓。由于它需要与非常老的Java版本兼容,因此维护变得更加困难,并且在2015年8月成为End of Life。它的替代方案SLF4J/Logback,对框架进行了许多必要的改进。 那么,为什么还要浪费心思去使用Log4j 2呢? 以下是一些原因。
- Log4j 2被设计成可用作审计日志框架。在重新配置时,Log4j 1.x和Logback都会丢失事件。Log4j 2不会。在Logback中,Appender中的异常永远不会对应用程序可见。 在Log4j中,可以将Appender配置为允许异常渗透到应用程序。
- Log4j 2包含基于LMAX Disruptor库的下一代异步日志记录器(Asynchronous Loggers)。 在多线程场景中,相比 Log4j 1.x和Logback ,异步日志记录器的吞吐量高10倍,延迟低几个数量级。
- Log4j 2对于独立应用程序是无垃圾的,对于稳态日志记录期间的Web应用程序是低垃圾。 这减少了垃圾收集器的压力,并提供更好的响应时间性能。
- Log4j 2使用一个插件系统,通过添加新的Appender,Filters,Layouts,Lookups 和 Pattern Converters,可以非常轻松地扩展框架,而无需对Log4j进行任何更改。
- 由于插件系统配置更简单。配置中的条目不需要指定类名。
- 支持自定义日志级别。 可以在代码或配置中定义自定义日志级别。
- 支持lambda表达式。 只有在启用了请求的日志级别时,在Java 8上运行的客户端代码才能使用lambda表达式来延迟构造日志消息。 不需要显式级别检查,从而产生更清晰的代码。
- 支持Message对象。 消息允许支持有趣和复杂的构造通过日志系统传递并被有效地操作。 用户可以自由创建自己的
Message
类型,并编写自定义 Layouts,Filters 和 Lookups 来操作它们。 - Log4j 1.x支持Appender上的Filters。 Logback添加了TurboFilters,允许在Logger处理事件之前对事件进行过滤。Log4j 2支持可以配置为在Logger处理事件之前处理事件的 Filters,因为它们由一个Logger或在一个Appender上处理。
- 许多Logback Appender不接受布局,只会以固定格式发送数据。 大多数Log4j 2 Appender接受布局,允许以任何所需格式传输数据。
- Log4j 1.x和Logback中的布局返回一个String。 这导致了Logback 编码器中讨论的问题。 Log4j 2采用更简单的方法,布局总是返回一个字节数组。 这样做的好处是,它意味着它们实际上几乎可以在任何Appender中使用,而不仅仅是写入OutputStream的Appender。
- Syslog Appender 既支持TCP和UDP,也支持BSD syslog和RFC5424格式。
- Log4J 2利用Java 5并发支持,并在可能的最低级别上执行锁定。log4j 1.x有已知的死锁问题。其中许多都是在logback中修复的,但许多logback类仍然需要在相当高的级别上进行同步。
- 它是一个Apache Software Foundation项目,遵循所有ASF项目使用的社区和支持模型。 如果您想贡献或获得提交更改的权利,请按照贡献中列出的路径进行操作。