一、log4j常用布局
#log4j的配置文件
#配置根日志
#格式:log4j.rootLogger=级别,输出源1,输出源2......
#其中级别有:DEBUG<INFO<WARN<ERROR<FATAL
#特别注意:这里定义了高级别的日志则类中低级别的不会写入比此低的信息
#输出源是:自定义的名字
log4j.rootLogger=INFO,FILE1,FILE2,FILE3
#配置输出源所对应的辅助类
#格式:log4j.appender.输出源=类名<类名可以不同形式>
log4j.appender.FILE1=org.apache.log4j.FileAppender
#指定文件名
log4j.appender.FILE1.File=e:/1.log
#指定布局方式(消息翻个如文件之后怎么布局)
log4j.appender.FILE1.layout=org.apache.log4j.SimpleLayout
#高级日志配置1
log4j.appender.FILE2=org.apache.log4j.FileAppender
log4j.appender.FILE2.File=e:/2.html
log4j.appender.FILE2.layout=org.apache.log4j.HTMLLayout
#高级日志配置2 自定义布局
log4j.appender.FILE3=org.apache.log4j.FileAppender
log4j.appender.FILE3.File=e:/3.log
log4j.appender.FILE3.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE3.layout.conversionPattern=%t;%p;%c;%m;%d;%l;%n
====================================================================
#常见的几种自定义日志
#%t:线程名称
#%p:日志级别
#%c:日志消息所在类名 <常用>
#%m:消息内容
#%d:发生时间 <常用>
#%l:行数 <常用>
#%n:换行 <常用>
#注:如果要显示中文,则需要转码native2ascii
%表示output输入
p表示level
c表示调用的类
m表示log时的信息
n表示回车
M表示输出log时的信息的那个方法
F表示输出log时的信息的那个文件名
L表示输出log时的信息所在类的行数
LOG4J中PatternLayout的布局参数
ConversionPattern参数的格式含义
格式名 含义
%c 输出日志信息所属的类的全名,可以在其后指定继承的层数,比如{2}输出到其父类,{3}输出到父类的父类。
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28
%M 输出日志信息所属的函数的名称、参数类型、返回类型。
%m 输出代码中指定的信息,如log(message)中的message
%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推。可以用%5p或者%-5p来强制输出5个字符,不足的在前面或者后面补充空格。
%r 输出自应用启动到输出该日志信息所耗费的毫秒数
%t 输出产生该日志事件的线程名
%f 输出日志信息所属的类的类名。(测试的结果似乎应该是%F,而且输出的是那个类的文件名)
%l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
这个测试结果出入比较大。%L确实可以输出上面所说的行数。但是%l输出的却相当于%c.函数名(%F:%L)。
===========================================================================================
二、在Spring中配置Log4j
Spring最擅长的,就是在别家的蛋糕上再加些cream,让你J2EE without Spring的时候心痒痒。
log4j,可以有如下的cream:
1. 动态的改变记录级别和策略,不需要重启Web应用,如《Effective Enterprise Java》所说。
2. 把log文件定在 /WEB-INF/logs/ 而不需要写绝对路径。
3. 可以把log4j.properties和其他properties一起放在/WEB-INF/ ,而不是Class-Path。
在web.xml 添加
<!--如果不定义webAppRootKey参数,那么webAppRootKey就是缺省的"webapp.root"-->
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>ssh.root</param-value>
</context-param>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>WEB-INF/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>60000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
在上文的配置里,Log4jConfigListener会去WEB-INF/log4j.propeties 读取配置文件;
开一条watchdog线程每60秒扫描一下配置文件的变化;
并把web目录的路径压入一个叫webapp.root的系统变量。
然后,在log4j.properties 里就可以这样定义logfile位置
log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/myfuse.log
如果有多个web应用,怕webapp.root变量重复,可以在context-param里定义webAppRootKey。