论坛首页 Java企业应用论坛

使用log4j扩展包的RollingFileAppender生成带时间戳的日志文件

浏览 3360 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-05-05  
DailyRollingFileAppender生成的文件是不带时间戳的,必须在某个时间点后,才对原来文件加上时间戳进行重命名。
比如时间戳精确到小时,格式为.yyyy-MM-dd-HH,当前时间为2011-05-05的5点,那么日志为
log
时间变为6点之后(并且6点有日志访问),日志为
log
log.2011-05-05-05

因为log4j是事件触发的,如果某段时间没有日志访问,即使时间点到了,也不会加上时间戳进行重命名。比如两天后才有日志访问,这时才产生log.2011-05-05-05这个文件。这样会造成日志统计中,统计不到这个文件。

解决方法是,生成日志文件的时候就已经加上时间戳。比如5点时候的日志,就已经是log.2011-05-05-05。原log4j没有实现这个功能,需要自己继承FileAppender来实现一个Appender。我看了一下源码,可以参考DailyRollingFileAppender,修改一下它的构造函数和rollOver。自己没有去实验,不知道能不能成功。

apache-log4j-extras是log4j的扩展包,其中TimeBasedRollingPolicy可以实现这个需求。
需要的包:
log4j-1.2.15.jar
apache-log4j-extras-1.0.jar
注意:log4j必须是1.2.15以上,14不行

log4j配置文件不能使用properties,必须使用xml。配置可参考:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
     <!-- appender -->
     <!-- STDOUT -->
     <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
          <layout class="org.apache.log4j.PatternLayout">
               <param name="ConversionPattern" value="%d %p [%c] - %m%n" />
          </layout>
     </appender>

     <!-- FILE -->
     <appender name="FILE"
          class="org.apache.log4j.rolling.RollingFileAppender">
          <rollingPolicy
               class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
               <param name="FileNamePattern"
                    value="d:/logs/file.%d{yyyy-MM-dd-HH}" />
          </rollingPolicy>
          <layout class="org.apache.log4j.PatternLayout">
               <param name="ConversionPattern"
                    value="%m%n" />
          </layout>
     </appender>
    
     <logger name="view">
          <level value="info" />
          <appender-ref ref="FILE" />
     </logger>

     <root>
          <level value="info" />
          <appender-ref ref="STDOUT" />
     </root>
</log4j:configuration>

注意:org.apache.log4j.rolling.RollingFileAppender是rolling包下的,而不是原来的org.apache.log4j.RollingFileAppender

测试用例:
public static void main(String[] args) {
           Logger logger = Logger.getLogger("view");
           logger.info("test");
}


TimeBasedRollingPolicy的使用可参考:
http://logging.apache.org/log4j/companions/extras/apidocs/org/apache/log4j/rolling/TimeBasedRollingPolicy.html
   发表时间:2011-05-05  
logback飘过
0 请登录后投票
   发表时间:2011-05-06  
simplechinese 写道
logback飘过

看了下logback,它把这个功能集成进去了。那哥们老折腾了,弄了slf4j,又新开一个logback。
0 请登录后投票
   发表时间:2011-05-06  
logback实现以上需求的配置:
<timestamp key="byHour" datePattern="yyyy-MM-dd-HH"/> 
<appender name="FILE"
		class="ch.qos.logback.core.FileAppender">
		<File>d:/logs/file.${byHour}</File>
		<layout class="ch.qos.logback.classic.PatternLayout">
			<Pattern>
				%msg%n
			</Pattern>
		</layout>
	</appender>

	<logger name="view">
		<level value="info" />
		<appender-ref ref="FILE" />
	</logger>

不需要使用rolling包,直接产生带时间戳的日志文件。
0 请登录后投票
   发表时间:2011-05-09  
用 SLF4J + LOGBACK
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics