使用log4j时,一般是写在log4j.xml或者log4j.properties配置文件中,在代码里使用getLogger的时候,它会去自动寻找配置,先找log4j.xml,然后log4j.properties。当然,除了xml和properties以外还有其他的配置文件种类,但是不推荐使用。
使用log4j.jar之前,要先配置监听器。不配置监听器,就不能把日志输出到文件中。这需要在项目的Web.xml中增加如下配置:
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
这次我使用的是log4j.properties。配置如下:
#########################
log4j.rootLogger = info, stdout, D
log4j.appender.stdout =org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout =org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= [test] %d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.appender.D =org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File =${catalina.home}/logs/test/hanyetest.log
log4j.appender.D.DatePattern='.'yy-MM-dd
log4j.appender.D.Append = true
log4j.appender.D.Threshold = INFO
log4j.appender.D.layout =org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern =[test] %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n
#########################
一开始的log4j.rootLogger=info,stout,D中,log4j.rootLogger是根,“=info”指Log日志级别为info,所有级别小于info的日志都不会输出。日志级别排序如下:
OFF > FATAL > ERROR > WARN > INFO> DEBUG > ALL
日志输出配置分两部分,前一部分是stdout作为标准输出,log4j.appender.stdout.Target = System.out指按系统默认的方式输出日志,一般会输出到tomcat/logs/catalina.out中。
后一部分的配置,可以让日志输出到一个文件中,并且每天自动输出备份一次。所谓备份,就是重新建了一个文件,把这一天的日志分离出去成为一个单独的文件而已。它可以通过log4j的DailyRollingFileAppender实现。并且,通过设置DailyRollingFileAppender的属性,可以让日志让自己的意愿来输出。下面我就详细说一下它的每条属性:
log4j.appender.D.File:指日志输出的路径及文件。${catalina.home}指tomcat的根目录,所以这个日志是保存在tomcat/logs/test/ 文件夹下的hanyetest.log文件下。但是,我们的日志每天保存一份的,如果都叫hanyetest.log,那就不能区分了,所以,下面一条属性。
log4j.appender.D.DatePattern=’_’yy-MM-dd:在DailyRollingFileAppender中,可以指定按月、周、天、半天(没错,半天!)、小时、分钟来备份日志。它们的配置是:
*yyyy-MM,对应monthly(每月)
*yyyy-ww,对应weekly(每周)
*yyyy-MM-dd,对应daily(每天)
*yyyy-MM-dd-a,对应half-daily(每半天)
*yyyy-MM-dd-HH,对应hourly(每小时)
*yyyy-MM-dd-HH-mm,对应minutely(每分钟)
并且这个日期会加到前面说的日志名后面,所以,按上面的配置,最后的日志名会是“hanyetest.log_xx-xx-xx”,前面的‘_‘可以替换,后面的xx-xx-xx是指日期。
log4j.appender.D.Threshold:指定了日志的最低输出级别。
log4j.appender.D.layout.ConversionPattern:指定了日志的输出格式。可使用的格式如下:
%c 输出日志信息所属的类的全名
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2002-10-18-22:10:28
%f 输出日志信息所属的类的类名
%l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
%m 输出代码中指定的信息,如log(message)中的message
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
%r 输出自应用启动到输出该日志信息所耗费的毫秒数
%t 输出产生该日志事件的线程名
配置好以后,在代码中加入日志:
private static Logger logger =LoggerFactory.getLogger(log4jTest.class);
在想要打印的地方加上日志打印就可以了:
logger.info("日志测试。");
运行程序,跑一遍打印日志的代码,你就可以看到生成的日志了。