Apache Log4j 2是Log4j的升级版,它比Log4j 1.x 版本有了很大的性能提升,在提供了Logback所能提供的功能的同时还解决了Logback的架构下的固有问题。
新特性和提升
API分离
- Log4j的API和具体实现做了分离,这样的好处就是应用开发人员可以很清晰的知道为了保证应用的向下兼容性可以使用哪些类和方法而哪些不能用。这也使得Log4j团队可以放心地对具体实现方法进行优化而不必担心兼容性。
性能提升
- Log4j 2包含了基于LMAX Disruptor类库的下一代异步日志工具。在多线程并发场景下异步日志工具的吞吐量是Log4j 1.x和Logback的18倍,而且还具有更低延迟的特性。详情请查看异步日志工具性能。另外,Log4j 2在很多关键领域的速度要比Log4j 1.x快很多,并在大多数环境下与Logback性能相似。更多信息查看性能分析。
支持多种API
- Log4j 2能提供最好的性能表现,同时它还能够支持SLF4J和Commons Logging API。
自动重新加载配置
- 像Logback一样Log4j 2也能根据配置的更改自动重新加载。但是与之不同的是,再重新加载配置的过程中日志依然能有效工作而不会因此丢失记录。
高级过滤
- 像Logback一样Log4j 2也能根据上下文数据、标记、正则表达式或者日志事件中的其他组件进行过滤。过滤器可以在所有事件被传递到Logger或者Appender之前被指定生效。另外过滤器也能跟Logger相关联。与Logback不同的是,你可以在这些环境中使用一个通用的过滤器类。
插件架构
- Log4j 使用了插件模式来配置组件。因此就不必再通过编码来创建或者配置Appender、Layout、Pattern Converter等内容了。Log4j会自动识别插件并按配置调用。
支持属性
- 你可以在配置文件中引用属性(property),Log4j会直接替代或者将其传递到一个底层组件并动态解析出来。属性来源于定义在各处的值,可以是在配置文件中、系统属性里、环境变量中、线程上下文Map里或者是事件的数据中。用户甚至可以通过添加他们自己的Lookup插件来自定义属性的提供方式。
支持Java 8 Lambda表达
- 以前,如果构造一个日志消息很复杂很耗时,那么通常你会在构造这个消息之前人工检查所要求的日志级别是否启用了。而Log4j支持lambda表达将使得使用Java 8 的客户端代码获益。因为如果所要求的日志级别未启用Log4j就不会对lambda表达式求值,这样就用更少的代码实现了相同功能了。
配置要求
Log4j 2.4及更高版本需要配合使用Java 7或更高版本,2.0-alpha1到2.3版本需要配合使用Java 6或更高版本。部分特性需要其他依赖,所需要的依赖已经在相关特性的文档中记录说明了。
新闻
Log4j 2现在已经可以用于生产环境了。Log4j 2的API不能与Log4j 1.x相兼容,但是可以通过一个适配器来让应用继续使用Log4j 1.x 的API。Apache Commons Logging和SLF4J的适配器也有提供。
文档资料
官方网站:logging.apache.org/log4j/2.x/
开源地址:github.com/apache/logg…