昨天进行代码评审的时候,大家都纠结在了日志信息应该如何输出上,其实我想大家应该一直都在使用log4j来对日志信息进行输出,但是未想应该有很大一部分人对log4j是不了解的,我遇到这个问题的时候也到网上找了一些参考资料,这些参考资料更多的是去介绍以下是怎么使用的。我们知道在使用log4j的时候我们需要将log4j对应的jar包放在lib下  然后将log4j.properties配置文件放在src下,也就是类的根目录下。我看很多的文章都是介绍在log4j.properties的配置文件中是如何配置都是代表什么意思。当然这也是很好的,最起码通过这些配置就会使用log4j来进行日志的输出了。但是我是想的是log4j是如何起作用的,最起码我想知道在工程启动的时候是怎么加载的。我们知道在log4j.properties的配置文件中的每一项都分别配置的是什么意思,但是这些配置应该是在加载的过程中做的初始化操作把。所以针对上面我说的这些大家应该知道针对这个log4j我想说些什么了吧。

好了 那就说一下下面要说的内容。是这样的,首先对log4j.properties的配置信息的每一项代表的是什么意思做一个介绍。让大家明白什么时候输出日志,输出到那里,什么时候可以每天输出一个以当天日期为名称的日志文件,什么时候可以在日志文件达到一定大小后重新在输出一个文件。error info debug 都是什么意思。

然后就是log4j在工程中的加载过程以及如何加载完后是如何起作用的,也就是我们在代码中使用:

private static Logger logger = Logger.getLogger(ConvertPdfToJpgWorker.class);的时候都做了些什么。以及我们使用log.error("") 和log.error("","")这有什么区别?

好了 先开始说第一个吧 就是对配置文件中每一项的解释:

log4j.rootCategory=INFO, stdout , R   

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=D:\\Tomcat 5.5\\logs\\qc.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
1log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n log4j.logger.com.neusoft=DEBUG
log4j.logger.com.opensymphony.oscache=ERROR
log4j.logger.net.sf.navigator=ERROR
log4j.logger.org.apache.commons=ERROR
log4j.logger.org.apache.struts=WARN
log4j.logger.org.displaytag=ERROR
log4j.logger.org.springframework=DEBUG
log4j.logger.com.ibatis.db=WARN
log4j.logger.org.apache.velocity=FATAL log4j.logger.com.canoo.webtest=WARN log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
log4j.logger.org.hibernate=DEBUG
log4j.logger.org.logicalcobwebs=WARN log4j.rootCategory=INFO, stdout , R log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=D:\\Tomcat 5.5\\logs\\qc.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
1log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n log4j.logger.com.neusoft=DEBUG
log4j.logger.com.opensymphony.oscache=ERROR
log4j.logger.net.sf.navigator=ERROR
log4j.logger.org.apache.commons=ERROR
log4j.logger.org.apache.struts=WARN
log4j.logger.org.displaytag=ERROR
log4j.logger.org.springframework=DEBUG
log4j.logger.com.ibatis.db=WARN
log4j.logger.org.apache.velocity=FATAL log4j.logger.com.canoo.webtest=WARN log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
log4j.logger.org.hibernate=DEBUG
log4j.logger.org.logicalcobwebs=WARN
上面是一个比较全一点的配置文件信息
Log4j说明

1      og4j.rootCategory=INFO, stdout , R

此句为将等级为INFO的日志信息输出到stdout和R这两个目的地,stdout和R的定义在下面的代码,可以任意起名。等级可分为OFF、 FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF则不打出任何信息,如果配置为INFO这样只显示INFO, WARN, ERROR的log信息,而DEBUG信息不会被显示,具体讲解可参照第三部分定义配置文件中的logger。

3       log4j.appender.stdout=org.apache.log4j.ConsoleAppender

此句为定义名为stdout的输出端是哪种类型,可以是

org.apache.log4j.ConsoleAppender(控制台),

org.apache.log4j.FileAppender(文件),

org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),

org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)

org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

具体讲解可参照第三部分定义配置文件中的Appender。

4       log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

此句为定义名为stdout的输出端的layout是哪种类型,可以是

org.apache.log4j.HTMLLayout(以HTML表格形式布局),

org.apache.log4j.PatternLayout(可以灵活地指定布局模式),

org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),

org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

具体讲解可参照第三部分定义配置文件中的Layout。

5       log4j.appender.stdout.layout.ConversionPattern= [QC] %p [%t] %C.%M(%L) | %m%n

如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下:

%m 输出代码中指定的消息

%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL

%r 输出自应用启动到输出该log信息耗费的毫秒数

%c 输出所属的类目,通常就是所在类的全名

%t 输出产生该日志事件的线程名

%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”

%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921

%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

[QC]是log信息的开头,可以为任意字符,一般为项目简称。

输出的信息

[TS] DEBUG [main] AbstractBeanFactory.getBean(189) | Returning cached instance of singleton bean 'MyAutoProxy'

具体讲解可参照第三部分定义配置文件中的格式化日志信息。

7       log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

此句与第3行一样。定义名为R的输出端的类型为每天产生一个日志文件。

8       log4j.appender.R.File=D:\\Tomcat 5.5\\logs\\qc.log

此句为定义名为R的输出端的文件名为D:\\Tomcat 5.5\\logs\\qc.log可以自行修改。

9       log4j.appender.R.layout=org.apache.log4j.PatternLayout

与第4行相同。

10     log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

与第5行相同。

12     log4j.logger.com. neusoft =DEBUG

指定com.neusoft包下的所有类的等级为DEBUG。

可以把com.neusoft改为自己项目所用的包名。

13     log4j.logger.com.opensymphony.oscache=ERROR

14     log4j.logger.net.sf.navigator=ERROR

这两句是把这两个包下出现的错误的等级设为ERROR,如果项目中没有配置EHCache,则不需要这两句。

15     log4j.logger.org.apache.commons=ERROR

16     log4j.logger.org.apache.struts=WARN

这两句是struts的包。

17     log4j.logger.org.displaytag=ERROR

这句是displaytag的包。(QC问题列表页面所用)

18     log4j.logger.org.springframework=DEBUG

此句为Spring的包。

24     log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN

25     log4j.logger.org.hibernate=DEBUG

此两句是hibernate的包。

 上面是对配置文件的一个讲解,通过配置文件中每一项的说明至少大家应该知道怎么使用了。下面就对大家比较关心的 ps  至少未比较关心 的如何在项目中加载,如何起作用的。好了 先看看如何被加载。是这样的可能我们大多数在使用的时候都是将log4j.properties的配置文件放在src或者类的根目录下,但是原因是什么,我想有些人未必知道。那咱们就先说默认放在src下是为什么把。咱们先看看log4j的jar包中的logManager中的代码:

org.apache.log4j.LogManager类有一个静态块,首先是找log4j.xml,找不到的情况下才找log4j.properties

Java code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// if the user has not specified the log4j.configuration
// property, we search first for the file "log4j.xml" and then
// "log4j.properties"
if (configurationOptionStr == null) {
url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE);
if (url == null) {
url = Loader.getResource(DEFAULT_CONFIGURATION_FILE);
}
} else {
try {
url = new URL(configurationOptionStr);
} catch (MalformedURLException ex) {
// so, resource is not a URL:
// attempt to get the resource from the class path
url = Loader.getResource(configurationOptionStr);
}
}


2,然后是怎么找呢:如下代码,是委托给classloader(加载Loader类的classloader)去找了,

Java code?
1
2
3
4
5
6
7
8
9
10
11
     

// We could not find resource. Ler us now try with the
// classloader that loaded this class.
classLoader = Loader.class.getClassLoader();
if(classLoader != null) {
LogLog.debug("Trying to find ["+resource+"] using "+classLoader
+" class loader.");
url = classLoader.getResource(resource);
if(url != null) {
return url;
}
}

3,classloader的getResource(...)又是怎么找呢:总是先从父classloader里去找,找不到才自己去找

Java code?
1
2
3
4
5
6
7
8
9
10
11
12
   

public URL getResource(String name) {
URL url;
if (parent != null) {
url = parent.getResource(name);
} else {
url = getBootstrapResource(name);
}
if (url == null) {
url = findResource(name);
}
return url;
}

总结:对于不同的应用服务器(或者web服务器)来说,classloader的层次不尽相同。这里以最简单的tomcat来说,如果你的应用是部署到
tomcat下的,使用log4j配置文件的顺序就是$TOMCAT_HOME/lib/log4j.xml或者log4j.properties;你自己web应用/WEB-INF/classes(或者lib)/log4j.xml或者log4j.properties.
对于WEB-INF下是classes优先还是lib优先 你可以自己测试一下。

这下知道是怎么加载的了把。上面也说了 log4j的jar默认就是到src目录下去找log4j.properties这个配置文件的。但是如果你没有将这个文件放在src下的。这个情况下就需要自己去加载了

最新文章

  1. ionic中关于ionicView 的生命周期
  2. Analyze network packet files very carefully
  3. paip.文件目录操作uAPI php python java对照
  4. Android开发权威指南(第2版)新书发布
  5. 08 Transactions
  6. poj 3264 线段树 求区间最大最小值
  7. java implement
  8. MATLAB 利用filter函数实现滑动平均滤波
  9. oracle(天猫处方药留言sql)
  10. 各种排序方法的JS实现
  11. B/S、C/S区别
  12. 简单的Elf逆向Writeup
  13. java课程之团队开发冲刺阶段1.7
  14. RabbitMQ消息队列(四)-服务详细配置与日常监控管理
  15. python读Excel
  16. TJOI2011书架(dp)
  17. 实现html转png
  18. webkit内核自定义隐藏滚动条
  19. 20145333茹翔 Exp5 MSF基础应用
  20. streamsets k8s 部署试用

热门文章

  1. Django小项目练习
  2. android IPC通信(上)-sharedUserId&&Messenger
  3. MySQL Infobright 数据仓库快速安装笔记[转]
  4. 基于XML配置的Sping AOP详解
  5. Android笔记之启动界面的设置
  6. Delphi 7以来的Delphi 2009测试版新语法特性
  7. Tomcat启动过程中卡住了
  8. 11、JavaScript 比较和逻辑运算符
  9. mac 中安装redis 以及 安装php-redis扩展过程详细记录
  10. windows下的host文件在哪里,有什么作用?