《Apache Log4j 2 用户指南》简介
1.1 欢迎来到log4j 2!
1.1.1 简介
几乎每一个大型应用程序都包含自己的日志记录或跟踪API。根据这个规则,在1996年初,E.U. SEMPER项目决定编写自己的跟踪API。经过无数次的改进,多次转世和大量的工作,API已经进化成为log4j,一种流行的Java日志记录包。该软件包是在 Apache Software License 下发布的,这是一个由开源倡议认证的完全成熟的开源许可证。最新的log4j版本,包括完整的源代码、类文件和文档,可以在http://logging.apache.org/log4j/2.x/index.html上找到。
用来调试代码的一种低技术方法,是将日志语句插入到代码中。因为调试器并不总是可用或适用,这也可能是唯一的方法。 对于多线程应用程序和大型的分布式应用程序,通常就是这种情况。
经验表明,日志记录是开发周期的一个重要组成部分。它有多个优点。它提供了有关应用程序运行的精确上下文。 一旦插入到代码中,日志输出的生成就不需要人为干预。 此外,日志输出可以保存在持久性介质中以便稍后进行研究。 除了在开发周期中使用之外,还可以将足够丰富的日志包视为审计工具。
正如Brian W.Kernighan和Rob Pike在他们的《编程实践》一书中所说:
作为个人选择,除了获取一个堆栈跟踪,或者一两个变量的值之外,我们倾向于不使用调试器。一个原因是,很容易迷失在复杂的数据结构和控制流程的细节上;我们发现,步进式执行程序的效率,低于努力思考并在关键位置添加输出语句和自检代码。单击语句所花费的时间比扫描正确放置的显示的输出要长。 即使我们知道代码的关键部分在哪里,决定放置打印语句的位置也会比单步执行需要更少的时间。 更重要的是,调试语句与程序保持一致;而调试会话是临时的。
日志确实有它的缺点。它会降低应用程序的速度。如果过于冗长,可能会导致滚动失明。为了缓解这些问题,log4j被设计成可靠、快速和可扩展的。由于日志记录很少是应用程序的主要关注点,因此log4j API力求简单易懂和易于使用。
1.1.2 Log4j 2
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项目使用的社区和支持模型。 如果您想贡献或获得提交更改的权利,请按照贡献中列出的路径进行操作。