Log4j使用相对路径指定log文件及使用总结

时间:2021-02-04 21:55:07

原文地址:http://huanyue.iteye.com/blog/574598

Log4j在指定log文件位置时一般是使用绝对路径,这样在部署环境发生变化时显得十分麻烦,在网上找了很多种方法,个人感觉以下方法比较适用:

由于spring也会加载log4j.properties,如果加载不到就往控制台打log信息。Spring提供了 一个Log4jConfigListener,本身就能通过web.xml中配置来指定位置加载log4j配置文件和log输出路径,注意该 listener需要放在spring的Listener之前。 
事实上,Log4jConfigListener更适合log4j在web工程中使用,原因如下: 
1. 动态的改变记录级别和策略,不需要重启Web应用,如《Effective Enterprise Java》所说。 
2. 把log文件定在 /WEB-INF/logs/ 而不需要写绝对路径。 
因为 系统把web目录的路径压入一个叫webapp.root的系统变量。这样写log文件路径时不用写绝对路径了. 
log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/settlement.log 
3. 可以把log4j.properties和其他properties一起放在/WEB-INF/ ,而不是Class-Path。 
4. log4jRefreshInterval为60000表示 开一条watchdog线程每60秒扫描一下配置文件的变化; 
在web.xml 添加

[xml] view plain copy
  1. <context-param>      
  2.         <param-name>log4jConfigLocation</param-name>      
  3.         <param-value>WEB-INF/log4j.properties</param-value>      
  4.   
  5. </context-param>         
  6. <context-param>      
  7.         <param-name>log4jRefreshInterval</param-name>      
  8.         <param-value>60000</param-value>      
  9. </context-param>   
  10.         <listener>      
  11.         <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>      
  12.   
  13. </listener>  

log4j配置文件如下:

[xml] view plain copy
  1. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  2. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  3. log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n  
  4. log4j.rootLogger=info, stdout,R  
  5.   
  6. log4j.appender.R=org.apache.log4j.DailyRollingFileAppender  
  7. log4j.appender.R.File=${webapp.root}/WEB-INF/logs/settlement.log  
  8. log4j.appender.R.DatePattern = "."yyyy-MM  
  9. log4j.appender.R.layout=org.apache.log4j.PatternLayout  
  10. log4j.appender.R.layout.ConversionPattern=%d %p [%c] - %m%n  

另:

Log4j提供的appender有以下几种
o org.apache.log4j.ConsoleAppender(控制台)
o org.apache.log4j.FileAppender(文件)
o org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
o org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
o org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

我们开发的B/S结构系统,在服务端一般要有日常运行的日志记录。保存成日志文件形式的时候,大家经常会遇到一个问题:日志文件过大。上百兆的日志文件对 查阅日志信息来说也是一个问题。所以我希望能够每天或每个月产生一个日志文件,这样文件不至于过大。 或者根据日志文件大小来判断,超过规定大小,日志自动增加新文件。

在log4j中这两种方式的实现都很简单,只要在配置文件中设置即可。

一、按照一定时间产生日志文件,配置文件如下:

# Set root logger level to ERROR and its only appender to A1.

log4j.rootLogger=ERROR,R

# R is set to be a DailyRollingFileAppender.

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

log4j.appender.R.File=backup.log

log4j.appender.R.DatePattern = "."yyyy-MM-dd

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

log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n

以上配置是每天产生一个备份文件。其中备份文件的名字叫backup.log。

具体的效果是这样:当天的日志信息记录在backup.log文件中,前一天的记录在名称为 backup.log.yyyy-mm-dd 的文件中。

类似的,如果需要每月产生一个文件可以修改上面的配置:

log4j.appender.R.DatePattern = "."yyyy-MM-dd

改为

log4j.appender.R.DatePattern = "."yyyy-MM

二、根据日志文件大小自动产生新日志文件

配置文件内容如下:

# Set root logger level to ERROR and its only appender to A1.

log4j.rootLogger=ERROR,R

# R is set to be a RollingFileAppender.

log4j.appender.R=org.apache.log4j.RollingFileAppender

log4j.appender.R.File=backup.log

#log4j.appender.R.MaxFileSize=100KB

# Keep one backup file

log4j.appender.R.MaxBackupIndex=1

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

log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n

其中:

#日志文件的大小

log4j.appender.R.MaxFileSize=100KB

# 保存一个备份文件

log4j.appender.R.MaxBackupIndex=1

另:

日志显示级别:

它们定义了日志显示的级别,一共分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,明白这一点很重要,这里Log4j有一个规则:假设设置了级别为P,如果发生了一个级别Q比P高,则可以启动,否则屏蔽掉。