一、为什么我们要使用Log4j
log4j是一个可以帮助开发人员进行日志管理的API类库。正如我们所知,如果在一个项目或产品中不做任何日志管理的话,那后果是十分可怕的。设想一下,有时客户会点出某些BUG,当维护人员赶去时,客户却发现自己怎么也点不出那个BUG了,还有即使点出来,如果一个空空的白页,维护人员也是难以解决的。这样几次下来,我想任谁都会崩溃。可如果实现我们做了日志处理,那情况就会好的多了。而且在开发期间我们也是需要日志帮助的。比如我们要去验证某个变量的值的时候,往往通过
System.out.println()语句将变量输入到控制台,而很显然,这类的调试语句在项目完成后是不应该再出现的。那时可能开发人员要一行一行的去找出
System.out.println()语句,然后将其删除或注释。如果当哪天我们又需要那些语句的时候……这时使用log4j可以很好的处理这类问题。因为它可以通过配置文件灵活的控制日志的输出方式以及输出类型,这点在稍后会详细的介绍,而选择它的另一个原因就是它的简单,让开发人员较容易掌握。
二、Log4j简单的应用
Log4j通常是通过一个配置文件来管理的,这个文件可以是java里常用的properties文件(键=值的形式),也可以是一个xml文件,当然也可以在java类里进行管理,但这种方式不如使用配置文件那样灵活,所以以下的例子我们通过使用properties文件来进行管理。
下面让我们开始,这一切会非常简单:我的环境是jdk1.5 + eclipse3.2 + MyEclipse5.首先创建一个项目,可以是java项目也可以是普通的java项目。这里创建一个普通的java项目,项目名称为:Log4jDemo,然后将log4j的包导入到项目中。现在创建一个测试类,名称为:
com.log4jdemo.Test,包路径为:并引入
org.apache.log4j.Logger这个类。
在main函数中做如下测试,因为只是个简单的例子,编写不是很规范。
Logger logger = Logger.getLogger(Test.
class
.getName());
这里通过指定名字获得一个日记记录器,一般名字为本类的名字。然后很简单:
logger.error(
"
这是条错误
..."
);
error为日志记录的优先级,或者简单的来说它为你可以定义的日志的类型,log4j定义的优先级为: OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL和自定义级别几种,但log4j建议我们使用其中的四种,优先级从高到低分别为:ERROR、WARN、INFO、DEBUG。级别的设置可以在代码里通过
logger.warn(
"
这是条警告
..."
);
logger.info(
"
这是条信息
..."
);
logger.debug(
"
这是条调试信息
..."
);
几种方式来定义通过这里级别的定义,你可以在配置文件中通过一个开关来控制日志的输出。比如将开关设置为INFO级
配置根Logger
log4j.rootLogger=
[level],[appenderName],[appenderName],...
当[level]设置为ALL时,则输出所有级别的日志,而当[level]设置为INFO的时候,则输出优先级相等或高于INFO级别的日志,以此类推,这里再次说明log4j里的优先级定义从低至高为: DEBUG 、INFO 、WARN 、ERROR 、FATAL。定义为OFF时则不做任何输出。
设置一个appender
log4j.appender.[NAME]=
org.apache.log4j.ConsoleAppender
这里的[NAME]就是上句[appenderName]所选的名称,可以理解为日志输出目的地的名字,名称可以随意取,我们知道日志可以输出到多个地方,比如可以输出到控制台,生成日志文件等。
log4j提供以下几种appender:
org.apache.log4j.ConsoleAppender//控制台
org.apache.log4j.FileAppender//文件
//
可以设置目标文件的大小,当文件到达这个尺寸的时候自动生成一个新的文
//
件,比如:
log.txt
、
log1.txt......
org.apache.log4j.RollingFileAppender
org.apache.log4j.DailyRollingFileAppender//每天产生一个日志文件
org.apache.log4j.WriterAppender//将日志信息以流的形式发送到任意指定的地方
设置日志文件的布局
log4j.appender.A1.layout=
org.apache.log4j.PatternLayout
org.apache.log4j.HTMLLayout//以HTML格式布局
org.apache.log4j.PatternLayout //可灵活指定布局模式
org.apache.log4j.SimpleLayout//简单的布局模式(包含日志信息的级别和字符串)
org.apache.log4j.TTCCLayout //包含日志产生的时间、线程、类别等等信息
设置输出样式
log4j.appender.A1.layout.ConversionPattern=
%-d{yyyy-MM-dd
HH
:
mm:ss}
[%c]-[%p]
%m%n
log4j采用类似C语法的格式化输出方式。
%m
输出代码中指定的消息
%p
输出优先级,即
DEBUG
,
INFO
,
WARN
,
ERROR
,
FATAL
%r
输出自应用启动到输出该
log
信息耗费的毫秒数
%c
输出所属的类目,通常就是所在类的全名
%t
输出产生该日志事件的线程名
%n
输出一个回车换行符,
Windows
平台为“
/r/n
”,
Unix
平台为“
/n"
%d
输出日志时间点的日期或时间,默认格式为
ISO8601
,也可以在其后指定格式,
比如:%d {yyy MMM dd
HH:mm:ss,SSS},输出类似2006年8月8日 17:10:28,921
%l
输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
比如本例为
com.log4jdemo.Test
下面我们来看一下完整的配置文件:
log4j.rootLogger=
ALL,A1,R
#=======
定义
appender
为控制台
=========#
log4j.appender.A1=
org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=
org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=
[%l]-[%p]
%m%n
#========
定义
appender
为
RollingFileAppender=========#
log4j.appender.R=
org.apache.log4j.RollingFileAppender
l
og4j.appender.R.File=
../logs/log.txt
log4j.appender.R.MaxFileSize=
512KB
log4j.appender.R.MaxBackupIndex=
1
log4j.appender.R.layout=
org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=
%d{yyyy-MM-dd
HH
:
mm:ss}
[%t]
[%c]
[%p]
-
%m%n
我们可以看到,这里定义了两个输出目的地,一个是控制台,另一个是生成一个日志并且当日志大小大于
512KB
的时候自动穿件一个新的备份日志。注意
log4j.rootLogger=
ALL,A1,R,这里可以选择如何将日志信息输出到什么地方,也就是说当项目不需要再向控制台输出的时候,我可以将rootLogger的A1去掉;如果当不需要输入或记录调试信息(debug)的时候,可以将All改为INFO,很方便吧?
做完这些,我们第一个
Log4j
的应用例子已经完成。(摘)