使用log4j的DailyRollingFileAppender时只有一个日志文件

项目使用log4j日志框架,需要每天生成一个日志文件。日志配置:

log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
#log4j.appender.D = org.apache.log4j.MyDailyRollingFileAppender
log4j.appender.D.File = ${catalina.home}/logs/myMavenWeb/allLog.log
log4j.appender.D.DatePattern='.'yyyy-MM-dd
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

项目部署在tomcat下面的webapps下面,当项目使用http://localhost:8080/myMavenWeb访问即(地址+项目名称)是日志正常,每天都会生成一个日志文件。
现在因为客户要求访问时候不要加项目访问即(http://localhost:8080),需要在tomcat的server.xml配置,然后问题来了,发现这样配置之后日志文件始终使用一个allLog.log,每天里面的内容都会被清空。

<Context docBase="myMavenWeb" path="" reloadable="true" source="org.eclipse.jst.jee.server:myMavenWeb"/></Host>

调试了一下日志发现在每天切换日志时候打印日志

log4j:Failed to rename ["+fileName+"] to ["+scheduledFilename+"].

去网上搜索、然后degbug发现的确是类DailyRollingFileAppender中调用rollOver()方法生成文件时候出的问题:

<java>
File file = new File(fileName);
boolean result = file.renameTo(target);
if(result) {
  LogLog.debug(fileName +" -> "+ scheduledFilename);
} else {
  LogLog.error("Failed to rename ["+fileName+"] to ["+scheduledFilename+"].");
}
</java>

1、修改DailyRollingFileAppender的源码然后重新编译。
boolean result = copy(file, target);

boolean copy(File src, File dst) throws IOException {  
   try {  
        FileInputStream in = new FileInputStream(src);  
        FileOutputStream out = new FileOutputStream(dst);  
           // Transfer bytes from in to out  
           byte[] buf = new byte[1024*4];  
           int len;  
           while ((len = in.read(buf)) > 0) {  
               out.write(buf, 0, len);  
           }  
           in.close();  
           out.close();  
        in.close();  
        out.close();  
        //清空原来的log文件,否则原log文件会越来越大
        FileOutputStream clearIn= new FileOutputStream(src);
        clearIn.write("".getBytes());
        clearIn.close();
        return true;  
    } catch (FileNotFoundException e) {  
        LogLog.error("源文件不存在,或者目标文件无法被识别.");  
        return false;  
    } catch (IOException e) {  
        LogLog.error("文件读写错误.");  
        return false;  
    }  
} 

自己修改好的log4j-1.2.17.jar文件: http://download.csdn.net/detail/tianshui0823/9688635
2。其实如果不想修改jar包源码的话,可以在项目中新建org.apache.log4j包,然新建类MyDailyRollingFileAppender(即和org.apache.log4j.DailyRollingFileAppender路径对应,保证MyDailyRollingFileAppender和DailyRollingFileAppender在同一路径下面),然后反编译并且复制类DailyRollingFileAppender的代码到MyDailyRollingFileAppender中然后进行修改,在log4j的配置文件中引入自己新建的类。这样也是可以的。

log4j.appender.D = org.apache.log4j.MyDailyRollingFileAppender

修好的MyDailyRollingFileAppender 文件
http://download.csdn.net/detail/tianshui0823/9688641
参照:http://duanni.iteye.com/blog/177271
参照:http://duanni.iteye.com/blog/177271

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值