2024年4月29日发(作者:)
Log4j2使用手册
一.Log4j2介绍
Log4j1.x 被广泛应用于应用程序,但是近年发展明显放缓,因为要维持较老java版本的使用,使得log4j1.x 的发
展更困难。而作为其代替品, slf4j/logback 做出了许多必要改进,为什么还需要log4j2? 主要有以下几个原因 :
(1) Log4j2被设计用作审计日志框架, log4j 和logback 在重载配置时,都会丢失日志时间,而log4j2不会。Logback
中appenders中的异常对于应用来说是不可见的,log4j2可以配置异常向应用渗透。
(2) Log4j2 包含基于 LMAX Disruptor library 的下一代无锁 Asynchronous Loggers ,在多线程环境下,
Asynchronous Loggers 相比slf4j / logback 提高了10倍以上的吞吐量,并且有着更低的延时。
(3) Log4j2的插件机制,使得在不需要修改框架的情况下,通过添加 Appenders, Filters, Layouts, Lookups 轻
松扩展框架。
(4) 简单的插件配置,无需指定具体类名即可在configuration 中配置插件。
(5) 支持自定义日志级别,可以在代码或者 configuration 中自定义日志级别。
(6) 支持lambda表达式,java8的应用可以在请求日志级别启用时使用 lambda表达式懒构建一个日志消息,不
需要显示的日志级别检查,使得代码更简洁。
(7) 支持消息对象,消息允许支持有趣和复杂的结构,传递到日志记录系统,并且可以高效的操作。用户可以自由
创建消息类型和 编写Layouts, Filters and Lookups 来操作这些消息。
(8) Log4j1在Appenders 上支持 Filters 。 logback增加了 TurboFilters ,允许在日志事件在处理前进行过滤。
Log4j2可以配置 Filters 在Logger后者Appender 前运行。
(9) 许多Logback的Appenders 不接受Layout,并且只能按照固定格式发送日志数据。大部分 log4j2 接收Layout
配置,允许日志数据按照任何所需格式传输。
(10) Log4j1与logback 的 Layouts 是返回一个String 类型,这可能导致一些编码问题。Log4j2使用了简单的方
式:返回一个 byte 数组。这以为着Layouts 可以用在几乎任何appenders ,而不仅仅是 写入OutputStream。
(11) Syslog appender 支持 TCP与UDP,以及BSD syslog 和 RFC5424格式。
(12) Log4j2 得益于java5的并发支持,将锁的可能降到最低水平。Log4j1 有已知的死锁问题,Logback也需要使
用synchronization 来保持在相当高的锁级别。
(13) Apache 开源
二.Log4j2架构
1. Log4j2类图
应用程序调用Log4j API 时需要向LogManager 传入一个特定的名称来获取一个Logger实例。LogManager 会定
位一个合适的 LoggerContext然后从中获取 Logger 。如果 Logger必须新建,那么与之关联的 LoggerConfig 遵
守如下规则 : (1)与Logger名称完全相同。(2)父Logger 的名称。(3)Root LoggerConfig 。LoggerConfig 对
象是根据 configuration 配置中的Logger 声明创建的。LoggerConfig 又与处理LogEvents 的 LoggerConfig 关
联。
2. 日志层次
logging API 相比于 纯粹的n 最重要的不同是 : logging API 可以禁用一些log语句输出的同时
允许其他一些语句块输出。这种能力建立在开发者按照一定规则将日志分类的基础上。
Log4j1.x 的层次关系是通过 Loggers 之间的关系保持的。而 Log4j2.x 是通过 LoggerConfig 对象来维持这种层
次关系的。
Loggers 与 LoggerConfigs 都是带名称的实体。Logger名称是大小写敏感的,并且符合如下命名层级规则:
一个LoggerConfig 的名字是另外一个 LoggerConfig 名字 加上 . 和一些后缀字符。 那么这个 LoggerConfig
是另外的 LoggerConfig 的子类。 类似于 java 的 package 路径。 例如 : 一个 名称为 ""的
LoggerConfig 是 一个名称为 "" 的LoggerConfig 的父类。类似的, “java” 是
""
的父类
和
""
的祖先类 。 开发人员对这样的命名方案应该很熟悉。
Root LoggerConfig 居于 LoggerConfig 分层的顶层。Root LoggerConfig 总是存在于每个 LoggerConfig的层次
中 。任何一个与root LoggerConfig相关联的Logger可以通过如下方式获得:
Logger logger = ger(_LOGGER_NAME);
也可以用如下简便方式:
Logger logger = tLogger();
发布评论