Log4j 2 日志记录组件
Apache Log4j 2
Log4j 2
是在前版本Log4j 1.x
上的一次升级,提供了重要的改进,并且在提供了很多可以在logback
上使用的一些改进。同时修复了在logback
架构中的内在固有问题。
特点
API 分离
Log4j 2
的API
独立于该实现部分,这样对于应用开发者来说,可以更清晰的知道他们能够使用的类和方法并保证向前兼容性。同时也使得Log4j
团队可以安全并且以一个兼容的方式去继续改姓其内部实现。
Log4j
API
只代表日志记录的最上层,它可以组合Log4j
的实现一起被使用,同时也可以和之前提到的logback组合一起被使用。Log4j``API
比起SLF4J
有几个优势点:
1.Log4j``api
比起slf4j
只支持String
类型来讲额外支持日志Message
类型
2.log4j api
支持lambda
表达式
3.log4j api
提供了更多的日志方法
4.在slf4j
支持参数化日志格式外,log4j api
可以支持java中的java.text.MessageFormat
来作为输出信息格式
5.log4j api
提供了LobManager.shutdown()
方法。基础的日志记录实现类如果想起作用必须实现Termminable
接口
6.支持其他类似Markers
的构造器,log levels
,ThreadContext
性能提升–异步执行
log4j 2
内包含了基于LMAX Disruptor
包的下一代异步日志记录器,在多线程环境下异步日志记录器吞吐量是log4j 1.x
和logback
的18倍,并且同时延迟降低了几个数量级。在其他方面,log4j 2
也是大幅度领先log4j 1.x
和logback
的,尤其是在多线程异步应用程序中。
支持多API
log4j2 api
在提供最好的性能的同时,它还提供了支持其他组件的API
,如`log4j 1.2,slf4j,Commons Logging,java.util.logging APIs 。
避免单一锁定
对于log4j 2
api 应用程序编码的时候,始终可以选择使用任何SLF4J-兼容库来作为有着log4j-to-slf4j
适配器的记录器实现。
自动重加载配置文件
类似logback
,log4j 2
可以自动的重新加载修改之后的配置文件,但是不像logback
那样,它在重新配置文件的时候不会丢失任何日志事件。
预过滤
类似于logback
,log4j 2
支持基于上下文数据、标记、正则表达式还有log
事件中的其他组件进行过滤。过滤可以指定对所有事件生效,可以在通过loggers
之前或者在当事件通过appenders
之时。另外,过滤器也可以喝loggers
相关联,不像是logback
那样,log4j 2
的方式下,你可以在任务场景下使用该公共过滤器。
插件架构
log 4j
使用了插件的方式去配置组件,这样的话,你不需要去写代码去创建和配置Appender,Layout,Pattern Converter
等其他组件。log 4j
在配置文件引用这个组件的时候会自动的识别并且使用它们。
属性值支持
你可以在配置文件中引用属性值。log 4j
会直接使用配置的值替换默认值,log 4j
传递给基础组件,组件会自动解析他们。属性可以从配置文件、系统属性、环境变量、线程环境的Map结构、在事件中的数据。使用者可以更进一步通过增加查找插件来定制属性。
Java 8 Lambda 支持
之前,如果构建一个消息太过昂贵,因为你需要在构建消息前去明确检查这个请求日志的等级是否开启可用。客户端代码运行在java 8的平台,可以支持lambda表达式。因为判断请求日等级是否启用的时候,Log4j
不需要去评估lambda表达式。所以在代码方面可以使用的更少。
自定义日志等级
在log 4j
中,自定义日志可以很容易的在代码中或者配置文件中定义。不需要子类。
日志构建API
在log 4j api
中除了使用多个日志方法的一个之外,日志事件也可以使用构建器构造。
无垃圾
在稳定状态的日志收集中,log 4j 2
在标准程序中会不会产生垃圾的。在web程序中有较少的垃圾。这减少了垃圾收集器的压力并且得到了更大的响应性能。因为GC基本不存在,所以不会有java清理垃圾的卡顿。
服务器的集成
版本2.10.0中加入了log4j-appserver
模块来提高和tomcat
和jetty
的集成交互性能。
云支持
版本2.10.0支持通过Lookup来访问docker容器信息和通过Spring Clound环境来访问和修改配置文件。并且在2.13.0版本进行了加强。增加访问spring boot
和Kubernetes
信息的支持。
兼容 log 4j 1.x
对于使用了log 4j 1.x
方法的应用程序,log 4j 1.2-api
和log 4j 2
提供了兼容性。log 4j 2 的 2.13.0
版本依旧支持旧版的配置文件。
硬件支持
log 4j 2
2.13.0版本要求java 8环境以上,2.12.1 要求java 7版本年以上。一些特性需要一些可选择的依赖库。这些特性所需要的依赖库会在文档中特别指出。
新鲜事
Log4j 2.14.1
现已投入生产。Log4j 2
的API与Log4j 1.x
不兼容,但是可以使用适配器来允许应用程序继续使用Log4j 1.x API
。适配器也可用于Apache Commons Logging,SLF4J和java.util.logging。
Log4j 2.14.1
是Log4j
的最新版本。从Log4j 2.13.0
开始,Log4j 2
在运行时需要Java 8或更高版本。此版本包含新功能和修补程序,可以在最新的更改报告中找到。
Log4j 2.14.0
包含一个新的layout
JsonTemplateLayout,旨在最终替代JsonLayout。顾名思义,它使用模板来定义要包含在JSON中的元素。该布局由GitHub上log4j2-logstash-layout的作者提供,他现在是Log4j社区的成员。
Log4j 2.14.0添加了对MongoDB 4的支持,并删除了对MongoDB 2的支持。
Log4j 2.14.1维护与以前版本的二进制兼容性。