Log4j详解

strawbingo 2011-11-17

log4j由三部分组成:Logger、Appender、Layout

Logger代码:

packageorg.apache.log4j;

publicclassLogger{

//两个静态方法

publicstaticLoggergetRootLogger(){xxx}

publicstaticLoggergetLogger(Classname){xxx}

//打印方法

publicvoiddebug(Objectmessage){xxx}

publicvoidinfo(Objectmessage){xxx}

publicvoidwarn(Objectmessage){xxx}

publicvoiderror(Objectmessage){xxx}

publicvoidfatal(Objectmessage){xxx}

//通用的打印方法

publicvoidlog(Levellevel,Objectmessage){xxx}

}

Logger有5种级别,由低到高的顺序:debug,info,warn,error,fatal.

如果一个日志没有指定级别,那么他将从最近的一个指定级别的祖先的继承级别。

根记录器总是有级别的。

如:

记录器指定的级别最终的级别

rootinfoinfo

awarnwarn

a.bnonewarn

日志记录器在打印日志信息时,先检查该日志定义的级别,如果打印的级别大于等于该级别才会产生日志信息。

当我们调用Logger.getLogger(Stringname)时总是返回同一个记录器的引用,这样就方便不同类使用同一个记录器打印日志信息。

Appender组件

在log4j中信息通过Appender组件输出到目的地。一个Appender实例代表了一个输出的目的地。

一个记录器可以拥有多个Appender组件。

log4j提供的appender有以下几种。

1.org.apache.log4j.ConsoleAppender输出的目的地为控制台

2.org.apache.log4j.FileAppender输出目的地为文件

3.org.apache.log4j.DailyRollingFileAppender按照用户指定的时间或日期频率滚动产生日志文件

4.org.apache.log4j.RollingFileAppender当日志文件达到一定尺寸时备份文件

对于Appender是一种叠加性的,而且后代记录器只能记录其父类的Appender。如

记录器的名称添加的appender继承叠加性输出目标

rootA1/A1

xA-x1,A-x2trueA1,A-x1,A-x2

x.ynonetrueA1,A-x1,A-x2

x.y.zA-abctrueA1,A-x1,A-x2,A-abc

aA-a1falseA-a1

a.bnonetrueA-a1

a.b.cA-a1trueA-a1,A-a1

因为记录器a的叠加属性为false,所以不用叠加。由于a.b.c添加的appender与a.b继承的一样,所以最后A-a1会输出两份信息。

Layout组件

layout用于格式话输出日志信息

layout由以下几种组成

1.org.apache.log4j.SimpleLayout日志信息级别+日志信息

2.org.apache.log4j.HTMLLayout以html表格的方式输出日志信息

3.org.apache.log4j.xml.XMLLayout由log4j:event元素组成

4.org.apache.log4j.PatternLayout以自己指定的格式话方式输出

如格式话语句:%r[%t]%-5p%c-%m%n

实例:

%d{yyyy-MM-ddHH:mm:ss}[%r][%C][%F][%l][%t][%L][%M][%c]-[%-5p]%m%n

重点需要的参数:

%d{yyyy-MM-ddHH:mm:ss}指定日志日期格式

%C表示类完整的路径

%F表示类的名称

%l表示类路径和类名称以及行数

%m表示错误描述信息

%n表示最后输出回车换行

使用log4j的三个步骤:

1)获得日志记录器

2)读取log4j的配置文件

配置log4j的环境的三种方法

BasicConfigurator.configure()

PropertyConfigurator.configure(StringconfigName)

DOMConfigurator.configure(StringfileName)

三种主要的log4j的组件配置

如果配置跟记录器log4j.roorLogger=[level],[appendername1],[appendername2]

leve指定日志级别,包括DUBUG,INFO,WARN,ERROR,FATAL

appendername指定Appender组件,可以同时指定多个组件

如果配置其他的记录器的语法log4j.logger.loggerName=[level],[appendername1],[appendername2]

配置appender组件

log4j.appender.appenderName=完整的类名

log4j.appender.appenderName.option1=value1

....

log4j.appender.appenderName.optionN=valueN

配置layout组件

log4j.appender.appenderName.layout=完整的类名

log4j.appender.appenderName.layout.option1=value1

...

log4j.appender.appenderName.layout.optionN=valueN

具体配置实例:

#根记录器的日志级别是ERROR,这个级别以下的信息将都被忽略掉

#为跟记录器指定console的Appender

log4j.rootLogger=ERROR,console

#定义store的记录器,没有日志级别,将继承跟记录器的级别

#为store指定名为file的Appender,store还将记录跟记录器的Appender

log4j.logger.store=,file//逗号前没有值表示没有定义日志级别会继承根记录器的A日志级别,还将继承跟记录器的Appender

#定义console的appender是ConsoleAppender

log4j.appender.console=org.apache.log4j.ConsoleAppender

#console使用的SimpleLayout

log4j.appender.console.layout=org.apache.log4j.SimpleLayout

#定义名字为file的appender的类型是FileAppender

log4j.appender.file=org.apache.log4j.FileAppender

#指定file的存放路径和文件

log4j.appender.file.File=F:/folder/a.log

#file的appender使用的layout是PatternLayout

log4j.appender.file.layout=org.apache.log4j.PatternLayout

#指定日志信息的输出格式

log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-ddHH:mm:ss}[%c]-[%-5p]%m%n%n

#设置store的叠加型为false

log4j.additivity.store=false

#设置RollingFileAppender

log4j.appender.file=org.apache.log4j.RollingFileAppender

#设置最大的尺寸是1M,当到达1M时,开始备份

log4j.appender.file.MaxFileSize=1MB

#设置备份文件的最大数目为2个

log4j.appender.file.MaxBackupIndex=2

#指定存储路径

log4j.appender.file.File=D:/a.log

#HTMLLayout设置

log4j.appender.file.layout=org.apache.log4j.HTMLLayout

#指定打印输出文件所在的文件名和行数

log4j.appender.file.layout.LocationInfo=true

#设置DailyRollingFileAppender

log4j.appender.file=org.apache.log4j.DailyRollingFileAppender

#指定文件名的日期格式

log4j.appender.file.DatePattern='.'yyyy-MM-dd

#指定编码

log4j.appender.file.encoding=GBK

#指定是否继续添加

log4j.appender.file.Append=true

-------

log4j的环境配置与初始化

在web.xml中配置log4j的servlet

<servlet>

<servlet-name>log4jServlet</servlet-name>

<servlet-class>com.xxx.Log4jServlet</servlet-class>

<init-Param>

<param-name>log4jLocal</param-name>

<param-name>WEB-INF/log4j.properties

</init-Param>

<load-on-startup>1</load-on-startup>

</servlet>

在servlet中进行初始化

继承HttpServlet

在init方法中

Stringprefix=getServletContext().getRealPath("/");

Stringfile=getInitParameter("log4jLocal");

读取配置文件

PropertyConfigurator.configure(prefix+file);

java类中调用具体的Appender

staticLoggerstoreLogger=Logger.getLogger("store");

//进而调用storeLogger的打印方法就会打印到对应的appender中了。

相关推荐