Log4j简介
log4j是一个用Java编写的可靠,快速和灵活的日志框架(API),它在Apache软件许可下发布。
Log4j已经被移植到了C,C++,C#,Perl,Python和Ruby等语言中。
Log4j是高度可配置的,并可通过在运行时的外部文件配置。它根据记录的优先级别,并提供机制,以指示记录信息到许多的目的地,诸如:数据库,文件,控制台,UNIX系统日志等。
Log4j中有三个主要组成部分:
- loggers: 负责捕获记录信息。
- appenders : 负责发布日志信息,以不同的首选目的地。
- layouts: 负责格式化不同风格的日志信息。
log4j有很多特性,比如它是线程安全的,是经过优化速度的,还有一些特性后面逐渐体会吧。
Log4j 架构
有两种类型可用在Log4j的框架对象。
- 核心对象: 框架的强制对象和框架的使用。
- 支持对象: 框架和支持体核心对象,可选的对象执行另外重要的任务。
核心对象:
- Logger对象: 顶级层的Logger,它提供Logger对象。Logger对象负责捕获日志信息及它们存储在一个空间的层次结构。
- Layout对象: 该层提供其用于格式化不同风格的日志信息的对象。布局层提供支持Appender对象到发布日志信息之前。 布局对象的发布方式是人类可读的及可重复使用的记录信息的一个重要的角色。
- Appender对象: 下位层提供Appender对象。Appender对象负责发布日志信息,以不同的首选目的地,如数据库,文件,控制台,UNIX系统日志等。
支持对象:
log4j框架的其他重要的对象起到日志框架的一个重要作用:
- Level对象: 级别对象定义的任何记录信息的粒度和优先级。有记录的七个级别在API中定义:OFF, DEBUG, INFO, ERROR, WARN, FATAL 和 ALL
- Filter对象: 过滤对象用于分析日志信息及是否应记录或不用这些信息做出进一步的决定。 一个appender对象可以有与之关联的几个Filter对象。如果日志记录信息传递给特定Appender对象,都和特定Appender相关的Filter对象批准的日志信息,然后才能发布到所连接的目的地。
- 对象渲染器: ObjectRenderer对象是一个指定提供传递到日志框架的不同对象的字符串表示。这个对象所使用的布局对象来准备最后的日志信息。
- 日志管理: 日志管理对象管理的日志框架。它负责从一个系统级的配置文件或配置类读取初始配置参数。
Log4j 配置
log4j.properties文件是一个键 - 值对保存 log4j 配置属性文件。默认情况下,日志管理在CLASSPATH 查找一个名为 log4j.properties 的文件。
log4j.properties 语法:
# Define the root logger with appender X
log4j.rootLogger = DEBUG, X
# Set the appender named X to be a File appender
log4j.appender.X=org.apache.log4j.FileAppender
# Define the layout for X appender
log4j.appender.X.layout=org.apache.log4j.PatternLayout
log4j.appender.X.layout.conversionPattern=%m%n
log4j.properties 示例:
使用上面的语法,我们定义 log4j.properties 文件如下:
- 根日志记录器(logger)的级别定义为DEBUG并连接附加器命名为FILE
- 附加器(appender)File是定义为org.apache.log4j.FileAppender并写入到一个名为“log.out”位于日志log目录下
- 定义的布局模式是%m%n,这意味着每打印日志消息之后,将加上一个换行符
# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n
这样具体示例一下,我们可以看出,这其实也是分为3分模块,结构明显。
再来看看我们之前为MyBatis写的properties:
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.leesanghyuk.mapper=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
除了多出一行log4j.logger.com.leesanghyuk.mapper=DEBUG
,我们也不奇怪,这很容易明白用途所在。然后输出目的地是控制台,而不是文件。
Appenders负责的是输出目的地,它包含如下属性:
输出目的地有很多,比如常见的有FileAppender、JDBCAppender、ConsoleAppender等等。
我们使用的layout也有很多,可能的选项有:DateLayout、HTMLLayout、PatternLayout、SimpleLayout、XMLLayout。