今天,运行了几个月的应用,发现从4月1日起,日志都没有记录。一开始,以为是病毒,或者是黑客什么的,毕竟,在网络上难免的,而且以前也发生过这样的事情。
后来,打开了tomcat的日志时候,发现了log4j:ERROR Failed to rename的错误,初步怀疑是windows文件占用的问题。
决定,重新启动服务,看看反馈效果。效果要明天才能看到呢。
上网找了一下相应的文章,看到 http://duanni.iteye.com/blog/177271 也说了log4j的同样的问题,从而确认了自己的看法没有错,这是log4j再rename时候的一个bug。
我的应用环境是:
windows2003 server
MS SQL Server 2005
jdk 1.5
log4j 版本不详
问题描述:
发生在启动应用几个月以后,再也不会记录日志了。前几个月的日志还都正常保存着。
分析问题:
经过上面那个blog的提示,我认为会是因为windows系统将文件放入内存,从而提高读写效率,但也使得文件无法重命名,无法删除导致。
再进一步思考,log4j会有这么低级的错误吗?毕竟是很多人使用在很多应用上的开源工具了,这些问题都没有处理吗?
经过在linux上的实验发现,linux下的文件处理策略与windows不同,
windows为了提高文件读写效率,将经常使用的文件,放入内存,从而提高使用效率,但在系统底层认为还有必要保留文件时,文件是不可以被修改名称和删除的。类似的问题在我们经常删除文件夹时,系统报告文件被占用,无法删除是同样的道理。
linux的处理机制不同,在linux中,如果你打开了一个文件,在文件没有关闭的情况下,你是可以删除的,但当你不保存时关闭文件后,文件会不在系统中存在了。
这是两种不同的文件处理策略,很难说谁好谁坏,针对不同的用户,实现不同的策略,没有任何可异议的地方,但正是因为这种不同的策略,产生了,同样的java代码,在不同的系统中,会有不同的表现。
解决问题:
对于问题的解决,上面引用的blog中直接修改了log4j的原文件,而这种方式从根本上解决了问题的发生。我需要补充一点的是,当log4j拷贝或改名出现问题时,log4j仍然会清空原有日志文件,而即使是使用copy的方法,我们仍然无法预料操作系统会出现什么样的情况,不允许拷贝文件,也许类似的问题仍然会发生,所以,我们如果修改原文件,应该同时修改一下log4j这个处理策略的方面,避免日志没有被拷贝的情况下,被清空了(没有研究log4j代码,随后找到改哪里以后,我会补充上)。
但如果我的人员,开发能力比较低下的时候,就可能会产生比较大的麻烦,恰恰,我的人员能力正好是这种问题。
好在,我的应用是b/s系统,从而我想了另外一种技术上相对简单的处理策略:
1.每天定时重新启动服务
2.重新启动服务时,利用servlet的初始化方法,拷贝并清空原有日志文件
3.不能清空文件时,不拷贝原有日志文件,等待下次处理
3.改变log4j策略,使log4j不会自动生成每天日志文件,而是从头至尾就是一个文件
这种方法等于自己实现了log4j的每天日志策略,同时避免了日志因为操作系统的问题,无法拷贝或改变名称时也要清除内容的问题。
分享到:
相关推荐
log4j:ERROR Failed to rename
解决log4j:ERROR Failed to rename, win系统占用文件无法改名字的问题
log4j:ERROR Failed to rename错误; 网上查找了下原因,大概意思是日志文件始终被占有,所以当log4j对日志文件进行rename时,就发生了Failed to rename错误 。要修改log4j的源码,附件是我修改好后的,方便大家...
log4j:ERROR Failed to rename错误解决办法,修改源码里的DailyRollingFileAppender类,用此jar包就不会再出现ERROR Failed to rename的错误了
log4j:ERROR Failed to rename错误解决办法 http://www.blogjava.net/DreamAngel/archive/2011/11/10/363400.html
包括修改后的[color=darkred]org.apache.log4j.DailyRollingFileAppender[/color]类的源代码和已编译好的文件. 请用DailyRollingFileAppender.class替换log4j-1.2.15.jar包里相应的类. 博文链接:...
针对log4j:ERROR Failed to rename的问题,修改源代码中的DailyRollingFileAppender.java文件,将rename改为copy。 该log4j-1.2.15.jar,就是修改后的jar包。 已经过测试,可以正常生成日志文件。
log4j:ERROR Failed to rename错误; 网上查找了下原因,大概意思是日志文件始终被占有,所以当log4j对日志文件进行rename时,就发生了Failed to rename错误 。要修改log4j的源码,附件是我修改好后的,方便大家...
LogLog.error("Failed to rename[" + oldName + "] to [" + newName + "]."); } } ``` 在上面的代码中,我们首先创建了两个 File 对象,分别代表旧的文件夹和新的文件夹。然后,我们使用 renameTo 方法将旧的...
此外,当遇到启动失败的情况时,查阅错误日志(如 `/var/log/mysql/error.log`)是非常重要的,这可以帮助我们定位问题并找到解决方案。 总之,正确迁移MySQL的数据目录不仅涉及配置文件的修改,还涉及到系统安全层...
o CurrPorts now displays a simple error message if it fails to close one or more TCP connections. * Version 2.01: o The 'Remote Address' and 'Local Address' columns are now sorted by the IP ...
Failed to contact key server is removed Play free games online such as Synergy Play games with custom protection such as Race Replaced the "sponsor" picture Log file is created, please post it if you ...
Connected to an idle instance. SQL> startup^C SQL> startup ORACLE instance started. 2、在双机环境下 要想启动或关闭ORACLE系统必须首先切换到root用户,如下 su - root a、启动ORACLE系统 hareg -y ...
SCGCQ00322234 EnhancementRequest Utilities to show logical block size [AF512e, 512n, 4Kn,..] SCGCQ00322257 EnhancementRequest Implemented support for 4K sector drives in CLI. SCGCQ00322317 ...
其他一些对数组或哈希表有用的函数包括sort(),next(),prev()和each()。 对象 使用new语句产生一个对象: class foo { function do_foo () { echo "Doing foo."; } } $bar = new foo; $bar->do_foo(); 改变变量...