终于彻底解决了LOG4J:ERROR Failed to rename
来源:互联网 发布:erp软件提供商 编辑:程序博客网 时间:2024/06/05 01:16
最近被LOG4J:ERROR Failed to rename折腾得差点放弃使用log4j了。
想象:log4j 不能按日生成新的日志文件,直接把原来的给覆盖了。
经过跟踪调试,问题出现在
DailyRollingFileAppender.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 + "].");}
"Failed to rename ... "
renameTo失败很明显就是日志文件被占用,但是日志文件会被哪些线程占用?
在网上找了半天,终于发现
罪魁祸首竟然是
tomcat 的 server.xml中配置了
<Context path="" docBase="xxxx" debug="0" reloadable="true"/>
导致日志文件一直被占用,只有在停止tomcat时才被释放
。。。。。。。。。。。。。。。。。。。。。。。。 晕倒 。。。。。。。。。。。。。。
知道问题出现在哪就好解决了,当然是不要在server.xml中配置<Context path="" docBase="xxxx" debug="0" reloadable="true"/>
去掉该配置后,服务器的首页默认就在 webapps\ROOT\
如果想让自己的项目变成默认首页,那只能在ROOT\ 下增加一个自己项目的首页的文件了。
如果我一定要 在server.xml中配置<Context path="" docBase="xxxx" debug="0" reloadable="true"/>
还有没有其他的解决办法?
那就只能修改log4j-1.2.xx.jar的 DailyRollingFileAppender文件,网上提供的方法都是将 renameTO 改成copy
具体做法是:
将DailyRollingFileAppender.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 + "].");}
改为:
File file = new File(fileName); boolean result = copy(file, target); if (result) { //网上很多地方只是简单的做复制操作,这样将导致日志文件越来越大。所以,这里应该增加清空日志的方法,在复制成功后,清空原来的日志 FileWriter fw = new FileWriter(file); fw.write(""); fw.flush(); fw.close(); LogLog.debug(fileName + " -> " + scheduledFilename); } else { LogLog.error("Failed to rename [" + fileName + "] to [" + scheduledFilename + "]."); }
并且增加copy方法
/** * Copies src file to dst file. If the dst file does not exist, it is * created.8KB cache * * @param src * @param dst * @throws IOException */boolean copy(File src, File dst) throws IOException { try { InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dst); // Transfer bytes from in to out byte[] buf = new byte[8192]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.close(); return true; } catch (FileNotFoundException e) { LogLog.error("源文件不存在,或者目标文件无法被识别." ); return false; } catch (IOException e) { LogLog.error("文件读写错误."); return false; }}
代码参考:
http://duanni.iteye.com/blog/177271
http://redsky008.iteye.com/blog/1401765
- 终于彻底解决了LOG4J:ERROR Failed to rename
- log4j:ERROR Failed to rename
- log4j:ERROR Failed to rename
- log4j:ERROR Failed to rename
- log4j:ERROR Failed to rename错误解决办法
- 解决LOG4J:ERROR Failed to rename的问题
- Tomcat6下Log4j的log4j:ERROR Failed to rename错误解决办法
- log4j.properties配置详解与实例及LOG4J:ERROR Failed to rename
- 解决 log4j:ERROR Failed to rename,不需要修改源码。同时解决工程重复加载的问题。
- log4j:ERROR Failed to load driver问题
- 解决android Failed to rename directory 问题
- adb failed to start daemon 彻底解决
- Spring MVC 项目中配置log4j 出现错误log4j:ERROR Failed to excute sql
- xcodebuild error: unable to rename temporary
- 彻底解决 error: Unable to find vcvarsall.bat
- 彻底解决 error: Unable to find vcvarsall.bat
- 彻底解决 error: Unable to find vcvarsall.bat
- 彻底解决 error: Unable to find vcvarsall.bat
- 转向ARC的说明
- 由于其配置信息(注册表中的)不完整或已损坏系统无法启动光驱
- CHttpFile
- Python的字符串编码规则
- JQuery Multiselect学习备忘
- 终于彻底解决了LOG4J:ERROR Failed to rename
- Android res文件夹下资源定义及使用
- [Android源码分析]蓝牙配对之jni之上的点点滴滴
- BAE3.0新特性以及PHP快速上手指南
- 常见的Web负载均衡方法
- 如何快速学习 安卓开发
- linux 3.5.4 PTRACE(系列九)
- 三大WEB服务器对比分析(apache ,lighttpd,nginx)
- AssetManager.openFd(String fileName)读取assets下文件报错解决方案