log4j:ERROR Failed to rename错误

简介:

使用Log4j记录日志,遇到一个烦心的问题,就是每天创建新日志文件时(日志文件设置为:org.apache.log4j.DailyRollingFileAppender)报:log4j:ERROR Failed to rename错误; 

      经过一翻查找,最终知道导致这一错误的罪魁祸首是在Tomcat server.xml中所设置的<Context docBase="xxxx" path="/" reloadable="true"/>所导致的,由于加了这一设置,日志文件始终被其占有,所以当log4j对日志文件进行rename时,就发生了Failed to rename错误 。

 

     由于log4j在实现日志文件备份时使用的是file.renameTo(File)方法:

Java代码  收藏代码

  1. File file = new File(fileName);     

  2.     boolean result = file.renameTo(target);  

  3.   

  4.     if(result) {     

  5.       LogLog.debug(fileName +" -> "+ scheduledFilename);     

  6.     } else {     

  7.       LogLog.error("Failed to rename ["+fileName+"] to ["+scheduledFilename+"].");     

  8.     }    

 

 

     而File类的renameTo方法的作用是:”改名或者移动文件作用;在同一个目录下renameTo是改名,在不同目录下是移动",所以在对一个被其他线程所锁定的文件进行改名时,肯定是会报错的。

 

    为解决这一错误, 想来想去最终还是采用了http://duanni.iteye.com/blog/177271 的解决方案,修改了log4j源码,把file.renameTo(File)方法更改成copy文件了,算是解决了问题。不过还是有点担心,就像icefox_wjx 所说的一样,仍然无法预料操作系统会不会出现什么样的情况,如不允许文件copy等等;最终希望能有高人给出更好的解决方案。


修改后的jar如下:http://down.51cto.com/data/2232166



log4j.properties配置:

  1.  ### set log levels ###  

  2. log4j.rootLogger = debug , stdout , D , E  

  3.   

  4. ### 输出到控制台 ###  

  5. log4j.appender.stdout = org.apache.log4j.ConsoleAppender  

  6. log4j.appender.stdout.Target = System.out  

  7. log4j.appender.stdout.layout = org.apache.log4j.PatternLayout  

  8. log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n  

  9.   

  10. ### 输出到日志文件 ###  

  11. log4j.appender.D = org.apache.log4j.DailyRollingFileAppender  

  12. log4j.appender.D.File = logs/log.log  

  13. log4j.appender.D.Append = true  

  14. log4j.appender.D.Threshold = DEBUG ## 输出DEBUG级别以上的日志  

  15. log4j.appender.D.layout = org.apache.log4j.PatternLayout  

  16. log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n  

  17.   

  18. ### 保存异常信息到单独文件 ###  

  19. log4j.appender.D = org.apache.log4j.DailyRollingFileAppender  

  20. log4j.appender.D.File = logs/error.log ## 异常日志文件名  

  21. log4j.appender.D.Append = true  

  22. log4j.appender.D.Threshold = ERROR ## 只输出ERROR级别以上的日志!!!  

  23. log4j.appender.D.layout = org.apache.log4j.PatternLayout  

  24. log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n


  1. ### 保存异常信息到单独文件,并且日志文件每天滚动一次 ###  

  2. log4j.appender.D = org.apache.log4j.DailyRollingFileAppender  

  3. log4j.appender.D.File = logs/error.log ## 异常日志文件名  

  4. log4j.appender.D.DatePattern='_'yyyy-MM-dd-HH-mm

  5. log4j.appender.D.Threshold = ERROR ## 只输出ERROR级别以上的日志!!!  

  6. log4j.appender.D.layout = org.apache.log4j.PatternLayout  

  7. log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

ConversionPattern:

  1. %p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
    %d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。
    %r:输出自应用程序启动到输出该log信息耗费的毫秒数。
    %t:输出产生该日志事件的线程名。
    %l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.Java:10)。
    %c:输出日志信息所属的类目,通常就是所在类的全名。
    %M:输出产生日志信息的方法名。
    %F:输出日志消息产生时所在的文件名称。
    %L::输出代码中的行号。
    %m::输出代码中指定的具体日志信息。
    %n:输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"。
    %x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
    %%:输出一个"%"字符。







本文转自lzf0530377451CTO博客,原文链接:http://blog.51cto.com/8757576/1833898 ,如需转载请自行联系原作者









相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
25天前
|
SQL JSON Kubernetes
Seata常见问题之服务端 error日志没有输出,客户端执行sql报错如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
97 0
|
6月前
|
Java 程序员
【日志级别】log4j的8个日志级别(OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL)
【日志级别】log4j的8个日志级别(OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL)
238 0
|
6月前
批量打印 SAP CRM 系统所有包含 Error Message Log 的 订单
批量打印 SAP CRM 系统所有包含 Error Message Log 的 订单
32 0
|
10月前
|
存储 设计模式 缓存
详解MySQL Error Log
Error Log是MySQL的一个非常重要的日志,主要用来记录mysqld的启动和关闭,以及mysqld启动,关闭以及运行期间的诊断信息。本文主要对Error Log的初始化以及写入过程做一个详细的介绍。以下介绍基于MySQL 8.0.28。初始化日志服务的初始化代码调用堆栈如下:- mysqld_main   - init_error_log   //初始化日志子系统   - log_buil
详解MySQL Error Log
|
11月前
|
关系型数据库 MySQL
把log_error_verbosity设置为3,调试连接问题ERROR 2003 (HY000):ERROR 1045 (28000):
mysql 8里面使用global log_error_verbosity控制日志记录的详细程度
|
关系型数据库 MySQL
MySQL的Error日志是干什么的?底层原理是什么?
MySQL的Error日志是干什么的?底层原理是什么?
109 0
|
监控 Java 中间件
拦截应用 error日志并发送到钉钉群|Java 开发实战
现在应用都需要对日志进行监控或者报警,现在普遍的做法是采用EKL收集日志,然后再由Grafana进行内容展示和及告警策略等,那如果项目架构比较简单(单体应用),又不想搞那么多中间件依赖怎么办,这里有一种简单的方式可以实现~
拦截应用 error日志并发送到钉钉群|Java 开发实战
|
Java Android开发
Eclipse打不开,出现an error has occured see the log file(日志中出现!MESSAGE FrameworkEvent ERROR !STACK 0)问题
Eclipse打不开,出现an error has occured see the log file(日志中出现!MESSAGE FrameworkEvent ERROR !STACK 0)问题
575 0
Eclipse打不开,出现an error has occured see the log file(日志中出现!MESSAGE FrameworkEvent ERROR !STACK 0)问题
|
网络协议 关系型数据库 Linux
onfigure: error: no acceptable C compiler found in $PATH See `config.log' for more details 问题解决
onfigure: error: no acceptable C compiler found in $PATH See `config.log' for more details 问题解决
144 0
|
Unix Linux 异构计算
成功解决 ERROR: An error occurred while performing the step: “Building kernel modules“. See /var/log/nv
成功解决 ERROR: An error occurred while performing the step: “Building kernel modules“. See /var/log/nv
成功解决 ERROR: An error occurred while performing the step: “Building kernel modules“. See  /var/log/nv

热门文章

最新文章