`
QiaoDuanni
  • 浏览: 136919 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Tomcat6下Log4j的log4j:ERROR Failed to rename错误解决办法

阅读更多
Tomcat6下配置log4j

log4j配置到tomcat6可以看这里, tomcat6下配置log4j

引起log4j:ERROR Failed to rename的原因

引起log4j:ERROR Failed to rename的原因大致为
引用


关于使用renameTo需要注意的事项, 请看 请慎用java的File#renameTo(File)方法 , File.renameTo方法在linux下的问题

引起log4j:ERROR Failed to rename的条件

通常都是在配置文件采用
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
或者
log4j.appender.A1=org.apache.log4j.RollingFileAppender
的情况下遇到"异常"提示.

和异常相关的log4j源代码

查看log4j的源代码,和log4j:ERROR Failed to rename异常相关的代码为
/**
     Rollover the current file to a new file.
  */
  void rollOver() throws IOException {

    /* Compute filename, but only if datePattern is specified */
    if (datePattern == null) {
      errorHandler.error("Missing DatePattern option in rollOver().");
      return;
    }

    String datedFilename = fileName+sdf.format(now);
    // It is too early to roll over because we are still within the
    // bounds of the current interval. Rollover will occur once the
    // next interval is reached.
    if (scheduledFilename.equals(datedFilename)) {
      return;
    }

    // close current file, and rename it to datedFilename
    this.closeFile();

    File target  = new File(scheduledFilename);
    if (target.exists()) {
      target.delete();
    }

    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+"].");
    }

    try {
      // This will also close the file. This is OK since multiple
      // close operations are safe.
      this.setFile(fileName, false, this.bufferedIO, this.bufferSize);
    }
    catch(IOException e) {
      errorHandler.error("setFile("+fileName+", false) call failed.");
    }
    scheduledFilename = datedFilename;
  }

  /**
   * This method differentiates DailyRollingFileAppender from its
   * super class.
   *
   * <p>Before actually logging, this method will check whether it is
   * time to do a rollover. If it is, it will schedule the next
   * rollover time and then rollover.
   * */
  protected void subAppend(LoggingEvent event) {
    long n = System.currentTimeMillis();
    if (n >= nextCheck) {
      now.setTime(n);
      nextCheck = rc.getNextCheckMillis(now);
      try {
	rollOver();
      }
      catch(IOException ioe) {
	LogLog.error("rollOver() failed.", ioe);
      }
    }
    super.subAppend(event);
   }
}

重点在这里
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+"].");
    }


解决办法

解决办法为修改log4j的源代码, 修改
boolean result = file.renameTo(target);


 boolean result = copy(file, target);

然后再添加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;
		}
	}

此方法借鉴自 File Copy in JavaJava File Copy

后面的话
修改后的代码可以正常运行在tomcat6下, log文件替换正常. 没有高负载和集群环境下测试. 如有问题,还请大家积极反馈. 如果你有更好的办法请告诉我.  

附件 : 包括修改后的org.apache.log4j.DailyRollingFileAppender类的源代码和已编译好的文件.
请用DailyRollingFileAppender.class替换log4j-1.2.15.jar包里相应的类.

参考资料 :
http://logging.apache.org/
tomcat6下配置log4j
Log4J DailyRollingFileAppender 問題
请慎用java的File#renameTo(File)方法
File.renameTo方法在linux下的问题
File Copy in Java
Java File Copy
log4j 简明手册
  • DailyRollingFileAppender.zip (8.2 KB)
  • 描述: 包括修改后的[color=darkred]org.apache.log4j.DailyRollingFileAppender[/color]类的源代码和已编译好的文件. 请用DailyRollingFileAppender.class替换log4j-1.2.15.jar包里相应的类.
  • 下载次数: 610
9
0
分享到:
评论
9 楼 jacks808 2013-01-12  
注意关闭相应的流......
8 楼 jacks808 2013-01-12  
windows的默认磁盘扇区大小是4kb所以 建议把copy的byte数组大小改成4096 这样效率能好一些吧.
7 楼 Java控 2009-11-05  
Java控 写道
或者 直接去掉改名策略···当天生成的文件全部以日期做后缀·····

不存在 log4j.log  所有文件都有日期 每天过了旧文件不用改名 只用创建一个新日期的文件即可··



请各位高人 介绍一下 如果实现这个功能该如何修改源码?
6 楼 Java控 2009-11-05  
或者 直接去掉改名策略···当天生成的文件全部以日期做后缀·····

不存在 log4j.log  所有文件都有日期 每天过了旧文件不用改名 只用创建一个新日期的文件即可··
5 楼 Java控 2009-11-05  
rename 失败后执行 copy 失败后执行 thread.sleep 失败后 重启tomcat 
你看我这个方法如何? 相比rename的效率,copy的效率不可同日而语吧?
4 楼 h521999 2009-08-12  
选来选去,还是用楼主的方法。
3 楼 icefox_wjx 2009-04-10  
好东西呀,我也有相应的问题,刚刚处理了一下。想到个补充的事情

当log4j拷贝或改名出现问题时,log4j仍然会清空原有日志文件,而即使是使用copy的方法,我们仍然无法预料操作系统会出现什么样的情况,不允许拷贝文件,也许类似的问题仍然会发生,所以,我们如果修改原文件,应该同时修改一下log4j这个处理策略的方面,避免日志没有被拷贝的情况下,被清空了。

同时,出于人员技术水平的考虑,针对B/S结构程序,我有另外一种解决思路供大家参考,参考可见:
http://icefox-wjx.iteye.com/admin/blogs/364951
2 楼 sam_sam_2000 2009-02-17  
版主,经过你这样修改后,还有问题么?
1 楼 lyrix 2008-07-23  
改用copy方法后总在覆盖后才能执行 请教

相关推荐

    kafka 解决log4j:ERROR Failed to rename错误解决办法错误的jar包

    log4j:ERROR Failed to rename

    log4j:ERROR Failed to rename错误解决办法

    log4j:ERROR Failed to rename错误; 网上查找了下原因,大概意思是日志文件始终被占有,所以当log4j对日志文件进行rename时,就发生了Failed to rename错误 。要修改log4j的源码,附件是我修改好后的,方便大家...

    log4j修改源码后解决log4j:ERROR Failed to rename错误解决办法错误的jar包

    log4j:ERROR Failed to rename错误解决办法,修改源码里的DailyRollingFileAppender类,用此jar包就不会再出现ERROR Failed to rename的错误了

    log4j:ERROR Failed to rename

    解决log4j:ERROR Failed to rename, win系统占用文件无法改名字的问题

    解决log4j:ERROR Failed to rename代码包

    log4j:ERROR Failed to rename错误解决办法 http://www.blogjava.net/DreamAngel/archive/2011/11/10/363400.html

    log4j-1.2.15.jar

    针对log4j:ERROR Failed to rename的问题,修改源代码中的DailyRollingFileAppender.java文件,将rename改为copy。 该log4j-1.2.15.jar,就是修改后的jar包。 已经过测试,可以正常生成日志文件。

    log4j-1.2.16.jar

    log4j:ERROR Failed to rename错误; 网上查找了下原因,大概意思是日志文件始终被占有,所以当log4j对日志文件进行rename时,就发生了Failed to rename错误 。要修改log4j的源码,附件是我修改好后的,方便大家...

    用CFile::Rename给文件改名

    在Windows操作系统中,文件的改名操作实际上涉及到了文件系统的元数据修改,这些操作可能需要系统级别的权限,因此在某些情况下,即使用户有文件的读写权限,也可能因为缺乏改名权限而失败。 总的来说,使用CFile::...

    解决git:fatal:Unable to create”…/.git/index.lock” 的错误

    问题描述: 在使用git 进行提交时, 出现上面这个报错, 导致无法提交. 报错大致意思就是创建index.lock文件失败,因为已经存在index.lock文件了. index.lock文件是在.git下面, 而.git是一般是隐藏的, 那么可以通过以下...

    请慎用java的File#renameTo(File)方法

    以前我一直以为File#renameTo(File)方法与OS下面的 move/mv 命令是相同的,可以达到改名、移动文件的目的。不过后来经常发现问题:File#renameTo(File)方法会返回失败(false),文件没有移动,又查不出原因,再后来...

    python解决方案:WindowsError: [Error 2]

    ### Python解决方案:WindowsError: [Error 2] 在使用Python进行文件操作时,经常会遇到一些错误,特别是当涉及到文件系统时。本篇文章将详细介绍如何处理一个常见的错误——`WindowsError: [Error 2]`,并提供一种...

    nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error

    今天小编就为大家分享一篇关于nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:Developnodejsnode_global'at Error,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    nodejs提示:cross-device link not permitted, rename错误的解决方法

    Error: EXDEV: cross-device link not permitted, rename ‘C:\Users\THEDIS~1\AppData\Local\Temp\upload_9b46f1afc2f9ade074037c3fb707d271’ -&gt; ‘E:/node-rumen/tmp/test.png’ 文件上传的功能时候,调用fs....

    android的ftp4j的jar包

    总之,FTP4J为Android开发者提供了一种方便的FTP客户端解决方案,它可以帮助你在应用中实现高效、可靠的文件传输功能。正确集成并充分利用FTP4J的特性,将大大提高你的Android应用的实用性和竞争力。

    ORACLE Rename Table的语法

    在 ORACLE 中,重命名(Rename)一个表的命令是 ALTER TABLE old_name RENAME TO new_name,而不是 RENAME old_name TO new_name。 REname 命令只是 SQL*Plus 的命令,不能在其他程序中使用,如果将其放在 Java、...

Global site tag (gtag.js) - Google Analytics