服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

j2se综合--对于log4j的深层次的理解

log4j的好处在于:

1.

通过修改配置文件,就可以决定log信息输出到何处(console,文件,...),是否输出。
这样,在系统开发阶段可以打印详细的log信息以跟踪系统运行情况,而在系统稳定后可以关闭log输出,从而在能跟踪系统运行情况的同时,又减少了垃圾代码(system.out.println(...)等)。

2.

使用log4j,需要整个系统有一个统一的log机制,有利于系统的规划。

log4j的使用本身很简单。但合理地规划一个系统的统一log机制需要周全的考虑。

其他关于log4j的信息参看log4j自带的文档。

part ii 配置文件详细解释
先看一个配置文件的例子:

1.

配置文件的例子
  1. log4j.rootlogger=debug
  2. #将dao层log记录到daolog,alllog中
  3. log4j.logger.dao=debug,a2,a4
  4. #将逻辑层log记录到businesslog,alllog中
  5. log4j.logger.businesslog=debug,a3,a4
  6. #a1--打印到屏幕上
  7. log4j.appender.a1=org.apache.log4j.consoleappender
  8. log4j.appender.a1.layout=org.apache.log4j.patternlayout
  9. log4j.appender.a1.layout.conversionpattern=%-5p [%t] %37c %3x - %m%n
  10. #a2--打印到文件daolog中--专门为dao层服务log4j.appender.a2=org.apache.log4j.dailyrollingfileappender
  11. log4j.appender.a2.file=daolog
  12. log4j.appender.a2.datepattern='.'yyyy-mm-dd
  13. log4j.appender.a2.layout=org.apache.log4j.patternlayout
  14. log4j.appender.a2.layout.conversionpattern=[%-5p] %d{yyyy-mm-dd hh:mm:ss,sss} method:%l%n%m%n
  15. #a3--打印到文件businesslog中--专门记录逻辑处理层服务log信息log4j.appender.a3=org.apache.log4j.dailyrollingfileappender
  16. log4j.appender.a3.file=businesslog
  17. log4j.appender.a3.datepattern='.'yyyy-mm-dd
  18. log4j.appender.a3.layout=org.apache.log4j.patternlayout
  19. log4j.appender.a3.layout.conversionpattern=[%-5p] %d{yyyy-mm-dd hh:mm:ss,sss} method:%l%n%m%n
  20. #a4--打印到文件alllog中--记录所有log信息log4j.appender.a4=org.apache.log4j.dailyrollingfileappender
  21. log4j.appender.a4.file=alllog
  22. log4j.appender.a4.datepattern='.'yyyy-mm-dd
  23. log4j.appender.a4.layout=org.apache.log4j.patternlayout
  24. 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信息:

  1. log4j.appender.a2=org.apache.log4j.dailyrollingfileappender
  2. log4j.appender.a2.file=demo
  3. log4j.appender.a2.datepattern='.'yyyy-mm-dd
  4. log4j.appender.a2.layout=org.apache.log4j.patternlayout
  5. log4j.appender.a2.layout.conversionpattern=%m%n


3.

layout的配置
layout指定了log信息输出的样式。
详细信息请查看patternlayout的javadoc。
例子1:显示日期和log信息
  1. log4j.appender.a2.layout=org.apache.log4j.patternlayout
  2. 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信息
  1. log4j.appender.a2.layout=org.apache.log4j.patternlayout
  2. log4j.appender.a2.layout.conversionpattern=%d{yyyy-mm-dd hh:mm:ss,sss} %l "#" %m%n
  3. 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信息
  1. log4j.appender.a2.layout=org.apache.log4j.patternlayout
  2. 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)
  3. 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("...");
}
}