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) Syslogappender支持 TCP与UDP,以及BSDsyslog和 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相比于 纯粹的System.out.println 最重要的不同是 :logging API 可以禁用一些log语句输出的同时允许其他一些语句块输出。这种能力建立在开发者按照一定规则将日志分类的基础上。
Log4j1.x的层次关系是通过 Loggers之间的关系保持的。而 Log4j2.x是通过 LoggerConfig 对象来维持这种层次关系的。
Loggers 与LoggerConfigs 都是带名称的实体。Logger名称是大小写敏感的,并且符合如下命名层级规则: 一个LoggerConfig 的名字是另外一个LoggerConfig名字加上 . 和一些后缀字符。那么这个 LoggerConfig是另外的LoggerConfig的子类。类似于 java的 package路径。例如 : 一个名称为\的LoggerConfig 是一个名称为\的LoggerConfig 的父类。类似的,“java” 是\的父类和
\的祖先类。开发人员对这样的命名方案应该很熟悉。
RootLoggerConfig居于LoggerConfig分层的顶层。RootLoggerConfig总是存在于每个LoggerConfig的层次中。任何一个与root LoggerConfig相关联的Logger可以通过如下方式获得:
Logger logger =LogManager.getLogger(LogManager.ROOT_LOGGER_NAME); 也可以用如下简便方式:
Logger logger =LogManager.getRootLogger(); 其他的 Logger可以使用 LogManager.getLogger 的静态方法根据传入的名称获得。
3. LoggerContext
LoggerContext作为日志系统的锚点(用于根据日志名称定位日志输出信息的Logger),在不同的环境中,一个应用系统中可能存在多个有效的 LoggerContexts ,
4. Configuration
每个 LoggerContext 有一个有效的Configuration 。Configuration 包括所有的Appenders,上下文过滤器,LoggerConfigs 与包含StrSubstitutor的引用信息。在配置重载期间,两个Configuration 共存,一旦所有的 Logger重定向到新的Configuration ,旧的Configuration 将停用和丢弃。
5. Logger
Loggers 是调用LogManager.getLogger静态方法创建的。Logger本身不直接执行动作。它只有一个名称,并于一个LoggerConfig相关联。它继承自 AbstractLogger,当 configuration 被修改时,Loggers 将关联修改后的LoggerConfig,从而改变这个Loggers 的行为。
获取Loggers:
使用相同的名称调用 LogManager.getLogger方法,总是返回完全相同的Logger 对象。 例如:
Logger x =LogManager.getLogger(\); Logger y =LogManager.getLogger(\); X和y指向完全相同的 Logger对象。
Log4j配置环境通常是在应用程序初始化时完成的。最好的方式是读取配置文件。
Log4j很容易通过类名来命名,这可以在每个类初始化的时候完成Logger 的初始化,Logger 的名称就等于类的完整路径,这是一个定义Logger的简单有效的方式。当为日志文件输出具有 Logger名称的日志时,这种命名策略可以很容易看出一个日志消息的来源。当然这只是一种比较常见的日志命名方式,log4j并没有对此进行限制,开发人员可以按照需求进行命名。
因为使用类名命名 Logger是一个习惯用法。一个便利的方法是使用LogManager.getLogger() 来获取类的全路径名称的 Logger。
目前为止,使用类名来作为Logger 的名称是最好的方式。
6. LoggerConfig
当Logger对象在logging configuration 中被定义时, LoggerConfig对象同时被创建。LoggerConfig 包含一组Filters 来过滤传递到Appenders 的LogEvent 。LoggerConfig使用一组Appenders 用来处理这些事件。
Log Levels
LoggerConfigs 被分配一个日志级别,包括: TRACE, DEBUG, INFO, WARN, ERROR, FATAL。Log4j 2 也支持自定义日志级别,另一种获得更多日志粒度的方式是使用 Markers。
Log4j1 与logback都有日志级别继承的概念。在Log4j2中,因为 Loggers 和LoggerConfigs是2个不同的对象,所以这个概念的实现有所不同。但是因为每个Loggers都关联一个相应的LoggerConfig,所以最终效果是相同的。
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库log4j2中文手册在线全文阅读。
相关推荐: