log4j详解(转)

转载自:http://blog.csdn.net/evatian/article/details/8501517

 

Log4j – 如何配置多个logger?

分类: java

内容简介:

本文主要介绍 在一个系统中如何通过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如下:

[plain] view plaincopy
 
  1. log4j.rootLogger=ERROR  
  2. log4j.logger.com.testframework.web=ERROR,A3  
  3. log4j.logger.com.testframework.util= ERROR,A1,A2  
  4.   
  5. log4j.appender.A1=org.apache.log4j.ConsoleAppender  
  6. log4j.appender.A1.layout=org.apache.log4j.PatternLayout  
  7. log4j.appender.A1.layout.ConversionPattern=%m%n  
  8.   
  9. log4j.appender.A2=org.apache.log4j.RollingFileAppender  
  10. log4j.appender.A2.File=c:/508log.html  
  11. log4j.appender.A2.MaxFileSize=50000KB  
  12. log4j.appender.A2.MaxBackupIndex=1  
  13. log4j.appender.A2.layout=org.apache.log4j.HTMLLayout  
  14.   
  15. log4j.appender.A3=org.apache.log4j.RollingFileAppender  
  16. log4j.appender.A3.File=junitLog/WebTestLog.log  
  17. log4j.appender.A3.MaxFileSize=50000KB  
  18. log4j.appender.A3.MaxBackupIndex=1  
  19. log4j.appender.A3.layout=org.apache.log4j.PatternLayout  
  20. log4j.appender.A3.layout.ConversionPattern=%d{yyyy-MM-ddHH:mm:ss}%5p[%t](%F:%L)-%m%n  


第四步:在要输出日志的类中加入相关语句。

 

[java] view plaincopy
 
  1. package com. testframework.web  
  2.   
  3. Public class PersonTest{  
  4.   
  5.     //加载logger的语句- 加粗部分为log4j配置文件中配置的logger的名字  
  6.     static Logger logger = Logger.getLogger(PersonTest .class);  
  7.   
  8.     public void testGetPersonNameById(int personId){  
  9.                           ........      
  10.   
  11.    String personName = "";  
  12.   
  13.         try {  
  14.                 personName= dataPool. getPersonNameById (int personId);  
  15.                            
  16.                } catch (Exception e){  
  17.   
  18.                String errorMsg = " Get Person Name Failed!";  
  19.   
  20.               //利用logger输出信息到日志中  
  21.               logger.error(errorMsg,e);  
  22.               fail(errorMsg);  
  23.   
  24.               }  
  25.   
  26.                           ........  
  27.   
  28.      }  
  29.   
  30. }  

 

      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
name

Assigned
level

Inherited
level

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
Name

Added
Appenders

Additivity
Flag

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’。

log4j.additivity.com.demo.moduleone = false

 

参数说明

log4j.properties 使用
一.参数意义说明
输出级别的种类
ERROR、WARN、INFO、DEBUG
ERROR 为严重错误 主要是程序的错误
WARN 为一般警告,比如session丢失
INFO 为一般要显示的信息,比如登录登出
DEBUG 为程序的调试信息
配置日志信息输出目的地
log4j.appender.appenderName = fully.qualified.name.of.appender.class
1.org.apache.log4j.ConsoleAppender(控制台)
2.org.apache.log4j.FileAppender(文件)
3.org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
4.org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
5.org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
配置日志信息的格式
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
1.org.apache.log4j.HTMLLayout(以HTML表格形式布局),
2.org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
3.org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
4.org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
控制选项
Threshold=DEBUG:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
Target=System.err:默认情况下是:System.out,指定输出控制台
FileAppender 选项
Threshold=DEBUF:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
RollingFileAppender 选项
Threshold=DEBUG:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
日志信息格式中几个符号所代表的含义:
 -X号: X信息输出时左对齐;
 %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
 %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
 %r: 输出自应用启动到输出该log信息耗费的毫秒数
 %c: 输出日志信息所属的类目,通常就是所在类的全名
 %t: 输出产生该日志事件的线程名
 %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10)
 %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
 %%: 输出一个"%"字符
 %F: 输出日志消息产生时所在的文件名称
 %L: 输出代码中的行号
 %m: 输出代码中指定的消息,产生的日志具体信息
 %n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行
 可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
 1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
 2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
 3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
 4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。 


posted @ 2015-10-10 09:02  wrencai  阅读(349)  评论(0编辑  收藏  举报