项目使用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