Log4j2一学就会 (一)概述
Apache Log4j 2
Apache Log4j 2是Log4j的升级版本,对它的前身Log4j 1.x进行了重大改进,在提供Logback可用的高级特性的同时解决了Logback体系结构中的一些固有的问题。
特性
API分离
Log4j的API与实现是分开的,从而使应用程序的开发人员可以清楚地了解他们可以使用的类和方法,确保向前的兼容性。这允许Log4j团队以兼容的方式安全地升级Log4j的实现。
Log4j API是一个日志门面,可以与Log4j自有实现一起使用,也可以与其他日志实现(例如Logback)一起使用。
与SLF4J相比,Log4j API具有多个优点:
- Log4j API支持日志消息(logging message)而不只是字符串。
- Log4j API支持lambda表达式。
- 与SLF4J相比,Log4j API提供了更多的日志方法。
- 除了SLF4J支持的“参数化日志”格式外,Log4j API还支持使用java.text.MessageFormat语法的事件以及printf样式的消息。
- Log4j API提供了LogManager.shutdown()方法。基础的日志实现必须实现Terminable接口,该方法才能生效。
- 完全支持其他结构,例如标记(Markers),日志级别(log Levels)和ThreadContext(又名MDC)。
性能提升
Log4j 2包含一个基于LMAX Disruptor的下一代异步Logger。在多线程场景下,异步Logger比Log4j 1.x和Logback的吞吐量提高了18倍,延迟降低了几个数量级。另外,Log4j 2明显优于Log4j 1.x,Logback和java.util.logging,尤其是在多线程应用程序中。
支持多种API
Log4j 2 的API提供了最佳性能,但出于兼容性的考虑,也提供了对Log4j 1.2,SLF4J,Commons Logging和java.util.logging(JUL)等API的支持。
避免锁定
利用Log4j-to-slf4j Adapter,使用Log4j 2 API记录日志的应用程序也可以使用其他任何兼容SLF4J API的库作为底层的日志实现
自动重载配置
和Logback一样,Log4j 2可以在修改配置后自动重新加载。并且,与Logback不同,Log4j 2在重载配置时不会丢失日志事件。
高级过滤
和Logback一样,Log4j 2支持基于上下文数据,标记,正则表达式和Log Event中的其他组件进行过滤。可以在Log Event传递给Loggers之前或通过Appenders时指定过滤条件应用到所有事件。此外,过滤器还可以与Loggers进行关联。与Logback不同,你可以在上述的任何情况下使用通用的Filter类。
插件架构
Log4j 2使用插件模式来配置组件。无需编写代码即可创建和配置Appender,Layout,Pattern Converter等。Log4j 2自动识别插件,并在配置文件引用它们时使用。
属性支持
你可以在配置文件中引用属性,Log4j会直接替换它们,或者将它们传递给动态解析属性的基础组件。属性来自配置文件中定义的值,系统属性,环境变量,ThreadContext Map以及事件中存在的数据。用户可以添加自己的Lookup插件来自定义属性提供者。
Java 8 Lambda支持
以前,如果构建日志消息的成本很高,通常会在构建消息前显式检查是否启用了请求的日志级别。在Java 8上运行的客户端代码可以受益于Log4j的lambda支持。如果未启用请求的日志级别,Log4j不会评估lambda表达式,因此可以用更少的代码获得相同的效果。
自定义日志级别
在Log4j 2中,可以通过代码或配置文件轻松定义日志级别。不需要继承任何子类。
日志构建器API
除了使用Log4j API中的日志方法,还可以使用构建器来构造日志事件。
无垃圾
在稳态日志期间,Log4j 2 在独立应用程序中是无垃圾的,而在Web应用程序中是低垃圾的。这样可以减少垃圾收集器的压力,提供更好的响应时间性能。
与应用服务器集成
版本2.10.0中添加了模块log4j-appserver,可以提高与Apache Tomcat和Eclipse Jetty的集成。
启用云
从2.12.0版本开始,Log4j 2可以通过Lookup插件访问Docker容器信息,还可以通过Spring Cloud Configuration访问和更新Log4j配置。
在2.13.0版本中这项支持得到了增强,提供了对访问Spring Boot属性以及Kubernetes信息的支持。
与Log4j 1.x兼容
Log4j 2的Log4j-1.2-api模块为使用Log4j 1打印日志的应用程序提供了兼容性。从Log4j 2.13.0开始,Log4j 2还提供了对Log4j 1.x配置文件的实验性支持。
要求
Log4j 2.4及更高版本需要Java 7,版本2.0-alpha1至2.3需要Java 6。一些特性需要可选的依赖,特性文档中提供了说明