log4j的好处在于:
1.
通过修改配置文件,就可以决定log信息输出到何处(console,文件,...),是否输出。这样,在系统开发阶段可以打印详细的log信息以跟踪系统运行情况,而在系统稳定后可以关闭log输出,从而在能跟踪系统运行情况的同时,又减少了垃圾代码(system.out.println(...)等)。
2.
使用log4j,需要整个系统有一个统一的log机制,有利于系统的规划。log4j的使用本身很简单。但合理地规划一个系统的统一log机制需要周全的考虑。
其他关于log4j的信息参看log4j自带的文档。
part ii 配置文件详细解释
先看一个配置文件的例子:
1.
配置文件的例子- log4j.rootlogger=debug
- #将dao层log记录到daolog,alllog中
- log4j.logger.dao=debug,a2,a4
- #将逻辑层log记录到businesslog,alllog中
- log4j.logger.businesslog=debug,a3,a4
- #a1--打印到屏幕上
- log4j.appender.a1=org.apache.log4j.consoleappender
- log4j.appender.a1.layout=org.apache.log4j.patternlayout
- log4j.appender.a1.layout.conversionpattern=%-5p [%t] %37c %3x - %m%n
- #a2--打印到文件daolog中--专门为dao层服务log4j.appender.a2=org.apache.log4j.dailyrollingfileappender
- log4j.appender.a2.file=daolog
- log4j.appender.a2.datepattern='.'yyyy-mm-dd
- log4j.appender.a2.layout=org.apache.log4j.patternlayout
- log4j.appender.a2.layout.conversionpattern=[%-5p] %d{yyyy-mm-dd hh:mm:ss,sss} method:%l%n%m%n
- #a3--打印到文件businesslog中--专门记录逻辑处理层服务log信息log4j.appender.a3=org.apache.log4j.dailyrollingfileappender
- log4j.appender.a3.file=businesslog
- log4j.appender.a3.datepattern='.'yyyy-mm-dd
- log4j.appender.a3.layout=org.apache.log4j.patternlayout
- log4j.appender.a3.layout.conversionpattern=[%-5p] %d{yyyy-mm-dd hh:mm:ss,sss} method:%l%n%m%n
- #a4--打印到文件alllog中--记录所有log信息log4j.appender.a4=org.apache.log4j.dailyrollingfileappender
- log4j.appender.a4.file=alllog
- log4j.appender.a4.datepattern='.'yyyy-mm-dd
- log4j.appender.a4.layout=org.apache.log4j.patternlayout
- log4j.appender.a4.layout.conversionpattern=[%-5p] %d{yyyy-mm-dd hh:mm:ss,sss} method:%l%n%m%n
2.
appender的使用一个appender代表log信息要写向的一个地方。log4j可使用的appender有很多类型,这里只考虑3种:consoleappender,fileappender,dailyrollfileappender
2.1
consoleappender如果使用consoleappender,那么log信息将写到console。就是直接把信息打印到system.out上了。
2.2
fileappender使用fileappender,那么log信息将写到指定的文件中。这应该是比较经常使用到的情况。
相应地,在配置文件中应该指定log输出的文件名。如下配置指定了log文件名为demo.txt
log4j.appender.a2.file=demo.txt
注意将a2替换为具体配置中appender的别名。
2.3
dailyrollingappender使用fileappender可以将log信息输出到文件中,但是如果文件太大了读起来就不方便了。这时就可以使用dailyrollingappender。dailyrollingappender可以把log信息输出到按照日期来区分的文件中。如下配置文件就会每天产生一个log文件,每个log文件只记录当天的log信息:
- log4j.appender.a2=org.apache.log4j.dailyrollingfileappender
- log4j.appender.a2.file=demo
- log4j.appender.a2.datepattern='.'yyyy-mm-dd
- log4j.appender.a2.layout=org.apache.log4j.patternlayout
- log4j.appender.a2.layout.conversionpattern=%m%n
3.
layout的配置layout指定了log信息输出的样式。
详细信息请查看patternlayout的javadoc。
例子1:显示日期和log信息
- log4j.appender.a2.layout=org.apache.log4j.patternlayout
- log4j.appender.a2.layout.conversionpattern=%d{yyyy-mm-dd hh:mm:ss,sss} %m%n
打印的信息是:
2002-11-12 11:49:42,866 select * from role where 1=1 order by createdate desc
例子2:显示日期,log发生地方和log信息
- log4j.appender.a2.layout=org.apache.log4j.patternlayout
- log4j.appender.a2.layout.conversionpattern=%d{yyyy-mm-dd hh:mm:ss,sss} %l "#" %m%n
- 2002-11-12 11:51:46,313 cn.net.unet.weboa.system.dao.roledao.select(roledao.java:409) "#" select * from role where 1=1 order by createdate desc
例子3:显示log级别,时间,调用方法,log信息
- log4j.appender.a2.layout=org.apache.log4j.patternlayout
- log4j.appender.a2.layout.conversionpattern=[%-5p] %d{yyyy-mm-dd hh:mm:ss,sss} method:%l%n%m%nlog信息:[debug] 2002-11-12 12:00:57,376 method:cn.net.unet.weboa.system.dao.roledao.select(roledao.java:409)
- select * from role where 1=1 order by createdate desc
part 3 log4j的使用
log4j使用步骤有3个:
3.1
.根据配置文件初始化log4j配置文件如part 2所叙述。现在讲的是如何在程序中配置log4j。
log4j可以使用3中配置器来初始化:basicconfigurator,domconfigurator,propertyconfigurator
这里用的是propertyconfigurator。使用propertyconfigurator适用于所有的系统。
如下的语句
propertyconfigurator.configure("log4j.properties");
就以log4j.properties为配置文件初始化好了log4j环境。
注意一点:这个语句只需要在系统启动的时候执行一次。例如:在unet weboa项目中可以这么用:
在actionservlet的init()方法中调用一次。
public class actionservlet extends httpservlet{
/*** initialize global variables*/
public void init() throws servletexception {
// 初始化action资源
try{initlog4j();...}
catch(ioexception e)
{throw new servletexception("load actionres is error");}}
protected void initlog4j(){propertyconfigurator.configure("log4j.properties");}
}
//end class actionservlet
3.2
在需要使用log4j的地方获取logger实例如下是roledao类中的使用例子:
static logger log = logger.getlogger("dao");
注意这里使用"dao"标识符,那么对应的在配置文件中对应的配置信息如下:
#定义dao logger
log4j.logger.dao=debug,a2
#设置appender a2的属性
log4j.appender.a2=org.apache.log4j.dailyrollingfileappender
log4j.appender.a2.file=demolog4j.appender.a2.datepattern='.'yyyy-mm-ddlog4j.appender.a2.layout=org.apache.log4j.patternlayout
log4j.appender.a2.layout.conversionpattern=%-5p %d{yyyy-mm-dd hh:mm:ss} %l%n%m%n
public class roledao extends basedbobject{...static logger log = logger.getlogger("dao");
public beancollection selectall() throws sqlexception{
stringbuffer sql = new stringbuffer(sqlbuf_len);sql.append("select * from " + tablename + " order by roldid");
//system.out.println(sql.tostring());log.debug(sql);
}
}
3.3
使用logger对象的debug,info,fatal...方法log.debug("it is the debug info");
附件1:log4j的一个bug
当这样使用时,dailyrollingfileappender不能正确使用:
public class roledao(){
static logger log = logger.getlogger("dao");
//在每一次new roledao对象的时候都执行一次configure()操作
public roledao(transactionmanager transmgr) throws sqlexception{...propertyconfigurator.configure("log4j.properties");}
public void select(){...//使用log4j进行log记录log.debug("...");
}
}
闽公网安备 35060202000074号