分类 log4j 下的文章

LoggingEvent of Log4j

LoggingEvent是log4j各个系统模块间数据交换的主要元素,其位于org.apache.log4j.spi包中。LoggingEvent是log4j对一次日志记录行为的抽象,在使用日志记录器Logger调用相应info、warn、error等方法时,log4j都会相应创建一个LoggingEvent的实例。

1. 基本感官

LoggingEvent主要成员属性有:

Continue Reading...

Filter&ErrorHandler of Log4j

1. Filter

org.apache.log4j.Category、以及log4j继承自org.apache.log4j.AppenderSkeleton的Appender都提供了日志过滤Filter功能,即根据一定的规则对LoggingEvent进行过滤,只有满足规则条件的LoggingEvent才会输出到Appender中。Filter抽象类实现了OptionHandler接口,但一般过滤器没有具体的配置激活需求,故activateOptions方法体为空。log4j建议在实现自定义过滤器前理解log4j内置提供的过滤器即:DenyAllFilter、LevelMatchFilter、LevelRangeFilter、StringMatchFilter。

1.1 Filter接口

Filter关键接口签名为:

abstract public int decide(LoggingEvent event);

多个Filter通过其next属性关联起来,构成数据结构中常见的单向链表结构。Appender在进行日志过滤处理时,根据Filter添加顺序依次调用对应的decide(LoggingEvent)方法。decide方法会返回DENY(-1)、NEUTRAL(0)、ACCEPT(1)中的一个,这几个数字是Filter类中的静态常量。log4j的涉及模式借鉴了Linux ipchains设计思想。

在循环执行所有Filter的decide(LoggingEvent)方法时,如果过滤器返回:

Continue Reading...

PatternCoverter of Log4j

在log4j Layout部分,介绍了PatternLayout原理,具体使用org.apache.log4j.helpers包下的PatternParser、PatternConverter完成模式解析、格式转换、样式控制等过程。详细解析过程可见Layout:PatternLayout相关的介绍。

阅读代码发现在org.apache.log4j.pattern包下面,还有一套PatternParser、PatternCoverter,其具体实现逻辑和org.apache.log4j.helpers包下相对一致,但是抽象化、模块化更好一些。为什么2个地方都有PatternCoverter以及PatternParser呢?

[caption id="attachment_135" align="aligncenter" width="476"]PatternConverter org.apache.log4j.helpers.PatternConverter[/caption]

1. PatternConverter

org.apache.log4j.pattern.PatternConverter是一个抽象类,描述了模式转换相关的接口。有属性和函数:

Continue Reading...

Layout of Log4j part3

本文档使用Log4j版本为1.2.17

Layout of Log4j

Layout of Log4j part2

1. PatternLayout

1.1 PatternLayout demo

PatternLayout的目的是根据提供的转换conversion pattern序列化LoggingEvent,log4j推荐使用更新的EnhancedPatternLayout替代PatternLayout。conversion pattern的转换格式同C语言printf格式串较为接近。TTCCLayout对应到PatternLayout的模式字符串为%r [%t] %p %c %x - %m%n

  • conversion pattern每一个转换描述符都以%字符开始,后跟可选的格式描述符和转换字符。转换字符具体有目录category、日志级别priority、时间date、线程名等。
  • 格式描述符具体的控制格式化后的字符串的宽度、内边距padding、左右对齐等。
  • 在conversion pattern中可以自由插入其它非格式字面值,即字符串常量。
  • 非格式字面值和格式化控制字符之间没有明确分割符号,PatternLayout能够自己正确解析conversion pattern和常量字符串字面值。

举例子有一个直观印象,conversion pattern为%5p [%t]: %m%n其中:

Continue Reading...

Layout of Log4j part2

本文档使用Log4j版本为1.2.17

Layout of Log4j

Layout of Log4j part3

1. DateLayout

DateLayout仍然是一个抽象类,在Layout抽象类的基础上增加了时间相关的序列化功能,没有具体实现format的逻辑。TTCCLayout是DateLayout的具体实现子类。DateLayout主要属性有:
timeZoneID表示时区偏移量,支持计算夏令时。比如可缩写(CST中国标准时间),自定义timeZoneID如GMT +8:00,时区全名等,在log4j配置文件中配置项名为TimeZone
dateFormatOption支持"NULL", "RELATIVE", "ABSOLUTE", "DATE" 或者 “ISO8601等log4j内置时间序列化格式。也支持配置自定义的SimpleDateFormat格式串,在log4j配置文件中配置项名为DateFormat
"NULL", "RELATIVE", "ABSOLUTE", "DATE" 或者 “ISO8601等几个DateFormat具体实现有(org.apache.log4j.helpers):

org.apache.log4j.helpers.AbsoluteTimeDateFormat
org.apache.log4j.helpers.DateTimeDateFormat
org.apache.log4j.helpers.ISO8601DateFormat
org.apache.log4j.helpers.RelativeTimeDateFormat

Continue Reading...