日志在任何程序系统是不可缺少的。而开源项目Log4j是一个功能强大的日志组件,提供方便的日志记录功能。更多的介绍可以参考下列链接。
学习参考链接:
我自己学习过程中,是创建一个maven项目,以1.2.17版本为例,在pom.xml 文件中增加以下配置: maven会自动下载log4j-1.2.17.jar 到项目中
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
接下来是,配置文件, 支持两种格式的配置文件:
.xml文件
.properties文件 (使用的较多), Log4j.properties文件
### 设置### log4j.rootLogger = debug,stdout,D,E ### 输出信息到控制抬 ### log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n ### 输出DEBUG 级别以上的日志到=E://logs/error.log ### log4j.appender.D = org.apache.log4j.RollingFileAppender ### 文件目录及文件 ### log4j.appender.D.File = E://logs/log.log ### 最大文件大小 ### log4j.appender.D.MaxFileSize = 100kb ### 备份文件个数 ### log4j.appender.D.MaxBackupIndex = 10 ### 往后追加 ### log4j.appender.D.Append = true log4j.appender.D.Threshold = DEBUG ### 日志布局格式 ### log4j.appender.D.layout = org.apache.log4j.PatternLayout ### 日志输出格式 ### log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n ### 输出ERROR 级别以上的日志到=E://logs/error.log ### log4j.appender.E = org.apache.log4j.DailyRollingFileAppender log4j.appender.E.File =E://logs/error.log log4j.appender.E.Append = true log4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayout log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
1. 配置根Logger
根logger主要定义log4j支持的日志级别及输出目的地,其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中,level 是日志记录的优先级,分为OFF < FATAL < ERROR < WARN < INFO < DEBUG < ALL或者自定义的级别。不区分大小写。
注意:rootLogger 默认是对整个工程生效的。
需在控制台输入,只需将其中一个appender定义为stdout即可
常用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。
appenderName指定日志信息输出到哪个地方,可同时指定多个输出目的地。
2. 配置输出目的地Appender
Appender主要定义日志信息输出在什么位置,主要语法为:
log4j.appender.appenderName = classInfo
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.optionN = valueN
Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
org.apache.log4j.JDBCAppender(将日志信息保存到数据库中)
以ConsoleAppender为例,如:
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
3. 配置日志信息的格式Layout
Layout 负责格式化Appender的输出,其语法为:
log4j.appender.appenderName.layout = classInfo
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.optionN = valueN
其中,Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
4. 设置package输出级别
可以设置不同package的日志输出级别,语法为:
log4j.logger.packageName=level
其中,packageName为实际的包名,level为日志级别,例如:
log4j.logger.org.springframework=info
log4j.logger.org.apache.catalina=info
log4j.logger.org.apache.commons.digester.Digester=info
log4j.logger.log.test=debug
注意日志输出格式:
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
%c 输出日志信息所属的类的全名
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-M-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28
%f 输出日志信息所属的类的类名
%l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
%m 输出代码中指定的信息,如log(message)中的message
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
%r 输出自应用启动到输出该日志信息所耗费的毫秒数
%t 输出产生该日志事件的线程名
当配置好log4j后,我们在代码中怎么使用呢?
1. 获取日志记录器
一般情况下,在一个类中,会通过该类名来获取。如下例子,在maven项目中的App.java类中
static Logger logger = Logger.getLogger(App.class.getName());
2. 读取配置文件
笔者测试时,是创建的maven项目,需要注意下面。
当配置文件放在src/main/resources的目录下时,使用Class.getResourceAsStream()方法来加载
Properties prop = new Properties(); prop.load(this.getClass().getResourceAsStream("/log4j.properties"));
注意:上面代码,我这里省略了try...catch代码块。
1).若写成"log4j.properties",则是去当前类的class文件同一目录下找
2).若写成"/log4j.properties",/代表从根目录下查找配置文件,即target/classes。resources编译后的文件也在该目录下
3. 写入log信息
调用下面的方法即可:
Logger.debug(Object message); Logger.info(Object message); Logger.warn(Object message); Logger.error(Object message); ...