内容简介:
本文主要介绍 在一个系统中如何通过log4j的配置文件配置出多个logger,使得该系统可以在不同路径下输出多个内容不同的log 文件。并通过该实例的实现过程进一步讲解log4j的一些特性。
具体内容:
1. 如何在项目中配置log4j使得该系统可以输出web test的日志文件(自定义格式)到工程dist目录下的junitLog/WebTestLog.log目录下,输出508 check日志(html格式)到c:/508log.html路径下?
第一步:加入log4j-1.2.8.jar到lib下。
第二步:在CLASSPATH下建立log4j.properties(即将log4j的配置文件放在src的根目录下)。
第三步:根据需要修改log4j配置文件中的相应属性,修改之前就必须知道这些都是干什么的,在后面的部分具体讲解。
该实例中 根据需要 配好的log4j.properties如下:
log4j.rootLogger=ERROR log4j.logger.com.testframework.web=ERROR,A3 log4j.logger.com.testframework.util= ERROR,A1,A2 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%m%n log4j.appender.A2=org.apache.log4j.RollingFileAppender log4j.appender.A2.File=c:/508log.html log4j.appender.A2.MaxFileSize=50000KB log4j.appender.A2.MaxBackupIndex=1 log4j.appender.A2.layout=org.apache.log4j.HTMLLayout log4j.appender.A3=org.apache.log4j.RollingFileAppender log4j.appender.A3.File=junitLog/WebTestLog.log log4j.appender.A3.MaxFileSize=50000KB log4j.appender.A3.MaxBackupIndex=1 log4j.appender.A3.layout=org.apache.log4j.PatternLayout log4j.appender.A3.layout.ConversionPattern=%d{yyyy-MM-ddHH:mm:ss}%5p[%t](%F:%L)-%m%n
第四步:在要输出日志的类中加入相关语句。
package com. testframework.web Public class PersonTest{ //加载logger的语句- 加粗部分为log4j配置文件中配置的logger的名字 static Logger logger = Logger.getLogger(PersonTest .class); public void testGetPersonNameById(int personId){ ........ String personName = ""; try { personName= dataPool. getPersonNameById (int personId); } catch (Exception e){ String errorMsg = " Get Person Name Failed!"; //利用logger输出信息到日志中 logger.error(errorMsg,e); fail(errorMsg); } ........ } }
Note:由于Log4j中Logger具有java的继承特性,所以在这个实例中,为了实现‘com. testframework.web’包下的所有类都可以使用Appender A3将Error级别以上的信息输出到工程dist目录下的junitLog/WebTestLog.log日志文件中。所以在properties文件中用包名定义了一个logger
log4j.logger.com.testframework.web=ERROR,A3
且在java代码中用该包中的类名来加载logger
staticLogger logger = Logger.getLogger(PersonTest.class);
此时,在java代码中所加载的这个logger的名字是com.testframework.web.PersonTest, 根据继承原理,由于在log4j配置文件中没有定义这个logger的level和appender,所以这个logger将自动继承其父logger‘com.testframework.web’的level和appender设置。
对于log4j的java继承原理,后面的部分会详细介绍。
2. Log4j配置文件讲解
Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件log4j.properties(键=值)。下面将介绍使用log4j.properties文件作为配置文件的方法。
2.1 配置根Logger
Logger 负责处理日志记录的大部分操作。
其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,只有等于及高于这个级别的才进行处理,则应用程序中所有DEBUG级别的日志信息将不被打印出来。ALL: 打印所有的日志,OFF:关闭所有的日志输出。 appenderName就是指定日志信息输出到哪个地方,可同时指定多个输出目的地。
2.2 配置日志信息输出目的地 Appender
Appender 负责控制日志记录操作的输出。
其语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.optionN = valueN
这里的appenderName为在①里定义的,可任意起名。
其中,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),可通过log4j.appender.R.MaxFileSize=100KB设置文件大小,还可通过log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件。
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender
就是定义一个名为stdout的输出目的地,ConsoleAppender为控制台。
2.3 配置日志信息的格式(布局)Layout
Layout 负责格式化Appender的输出。
其语法为:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
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(包含日志产生的时间、线程、类别等等信息)
2.3.1格式化日志信息
Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:
%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM ddHH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
3. Log4j的java特性简介
Log4j简单的来说由3部分组成: logger,appender,layout。
Logger之间是具有java的继承特性的。Log4j有一个rootLogger,所有普通logger都默认继承rootLogger。而普通logger之间的继承关系是通过logger name来实现的。
例如,叫"com.foo.Bar"名字的logger就继承于叫"com.foo"名字的logger。就好像java中"java.util" 和"java.util.Vector"的关系一样。
而这些继承关系决定了logger的Level和Appender这两个属性的确定。
请看下面的例子(继承关系对确定logger的Level的影响):
Logger |
Assigned |
Inherited |
root |
Proot |
Proot |
X |
Px |
Px |
X.Y |
none |
Px |
X.Y.Z |
Pxyz |
Pxyz |
在上面例子中我们可以了解到如果一个普通logger定义了Level,则其level就使用它定义的(例如:logger X),如果没有定义,就使用其父logger的(例如:logger X.Y)。
请看下面的例子(继承关系对确定logger的Appender的影响):
Logger |
Added |
Additivity |
Output Targets |
Comment |
root |
A1 |
not applicable |
A1 |
The root logger is anonymous but can be accessed with the Logger.getRootLogger() method. There is no default appender attached to root. |
x |
A-x1, A-x2 |
true |
A1, A-x1, A-x2 |
Appenders of "x" and root. |
x.y |
none |
true |
A1, A-x1, A-x2 |
Appenders of "x" and root. |
x.y.z |
A-xyz1 |
true |
A1, A-x1, A-x2, A-xyz1 |
Appenders in "x.y.z", "x" and root. |
security |
A-sec |
false |
A-sec |
No appender accumulation since the additivity flag is set to false. |
security.access |
none |
true |
A-sec |
Only appenders of "security" because the additivity flag in "security" is set to false. |
在上面的例子中我们可以看出:
a. 如果一个普通logger定义Appender且其AdditivityFlag是true,则该logger的Appender包括其定义的Appender及其父logger定义的Appender。例如:logger‘x’。
b. 如果一个普通logger没有定义Appender,但其AdditivityFlag是true,则该logger的Appender为其父logger定义的Appender。例如:logger‘x.y’。
c. 如果一个普通logger定义了Appender,但其AdditivityFlag是false,则该logger的Appender只为其定义的Appender。例如:logger‘security’。