log4j.xml中的几个使用心得和说明

标签:
log4j |
分类: 技术 |
1. 希望不同的环境能够打印的日志级别不同
可以通过maven的profile来实现
a. 在project的pom.xml文件中增加参数log.level进行配置
这样就可以在开发和测试环境使用debug级别,而在生产环境使用info级别。
2. 希望开发环境的所有日志都能打印在console上,但在生产上不要这样做
同样,我们通过maven的profile来实现
a. 在project的pom.xml文件中增加参数default.appender进行配置
b. 在log4j.xml文件中可以如下引用
我们可以在log4j.xml文件中增加这些appender:
在开发环境使用console appender
在生产环境使用null appender
当然也可以配置将所有的日志都打印在一个公共的文件。
3. log4j.xml配置文件的一些说明
a. appender的说明
b. logger的说明

"root":是所有logger的父类
"additivity": 是否继承父类, false表示不继承
root是所有logger的最顶层父类,同时,如果有"a.b.c"和"a.b",那么"a.b"就是"a.b.c"的父类得了。就像"com.myweb"就是"com.myweb.project"的父类,在这样的情况下,com.myweb.project的日志也会打印在com.myweb下,解决这个问题的方法就是不继承,如果不继承了,就不会出现这种情况了。
这样做的结果就是其他日志的打印都是INFO,需要的日志可以为DEBUG,这样在console上就可以减少很多实用的框架的DEBUG信息了,例如一些框架像mybatis和struts2的信息等。
4. 日志打印的格式
当前打印的格式为:%d [%-5p] [%c{15}] - %m%n
参数说明:
%d: 日期 当前的格式为:yyyy-MM-dd HH:mm:ss,SSS
%-5p: %p表示该日志的级别,例如:INFO, DEBUG,
ERROR等,"-5"的意思是:若日志的级别长度小于5,则右边用空格填充。因为日志级别最大是5,所以这样做的目的是为了对齐,美观。
%c{15}:
logger的命名空间,"15"表示层数,假设当前logger名字空间是"a.b.c",那么%c{2}的值就是:b.c
%m: 显示具体的信息
%n: 当前平台下的换行符
具体支持的参数可以参考[6]
5. 关于打印行号的问题
目前的日志格式并没有显示行号,希望的日志应该是这样的:
2014-09-01 18:09:42,011 [INFO ]
com.myweb.project.webapp.controller.ClassA.methodB(ClassA.java:49)
- 我是坑丁小慢
日志有具体的类,方法还有行号
如果你在打印时如下使用: logger.info("abc");
那么只要将日志格式改为:%d [%-5p] [%l] - %m%n
%c{15} 改为 %l 就可以了。
但如果使用的是对logger方法封装的公共方法的话就比较麻烦了,如果只是将日志格式改为:%l,那么打印的类和方法和行数是这个公共方法的行数了,例如:
那么打印的时候的行数是:
com.myweb.project.MyLoggerUtils.info(MyLoggerUtils.java:20)
这并不是我们想要的,简单的说就是打印的是调用logger.info()方法的类,所以会有这种情况。要解决这个情况,深入分析log4j的源码会发现log4j是将堆栈信息打印,然后找到第一个和logger的name匹配的类就作为了日志所在的类了。具体可以看下org.apache.log4j.spi.
LocationInfo类的源码,关键就是:fqnOfCallingClass参数,知道具体的原因,我们可以尝试着解决这个问题
:
编写类MyLogger继承org.apache.log4j.Logger类
关键就是属性:FQCN,这里可以定义为MyLoggerUtils.class.getName()。这样在处理的时候会跳过MyLoggerUtils.class,会继续找上一层,如果你有多层(打印日志在父类中),那么FQCN应该设置为实际类的最接近的一层。
随后编写类MyLoggerFactory
实现org.apache.log4j.spi.LoggerFactory接口
在声明logger时,这样定义:
就可以了,logger的使用和普通的用法没有区别,这样打印出来的日志就和我们期望的是一样的了。
6. 还可以做的事
希望在下一个项目的时候讲log4j升级为log4j
2代,也就是logback,同时研究下slf4j,使用slf4j。
参考资料:
[1] http://blog.csdn.net/yycdaizi/article/details/8276265
(java日志组件介绍(common-logging,log4j,slf4j,logback ))
[2] http://blog.csdn.net/wangjian5748/article/details/23824
(Log4j的中文文档)
[3] http://blog.jobbole.com/37518/ (从Log4j迁移到LogBack的理由)
[4] http://www.importnew.com/7450.html
(为什么要使用SLF4J而不是Log4J)
[5]
http://www.cnblogs.com/kevin-yuan/archive/2012/11/23/2784610.html
(Log4j使用详解(log4j.XML格式)——整理)
[6] http://unmi.cc/log4j-patternlayout-all-parameters/
(Log4j输出格式控制--log4j的PatternLayout参数含义[转])
[7] http://www.coderli.com/log4j-slf4j-logger-linenumber
(log4j日志封装说明—slf4j对于log4j的日志封装-正确获取调用堆栈)
后一篇:有待解决的技术问题