log4j错误信息:log4j:ERROR Failed to rename [D:/logs/wmts_] to [D:/logs/wmts_2015-12-21.log ].

起因:部门网站使用B/S架构请求,请求过程中需要将日志文件记录下来,以便出现问题进行查找,刚开始服务器上的日志文件能够正常输出,后来日志文件不能输出,部门领导让我查找原因并修改。

介绍:本人JAVA小白一枚,之前是学.Net出身,来到公司之后由于公司需要才转的JAVA,日志输出做的比较少所以部门经理刚交给我的时候心里还是小忐忑的。

目的:使用log4j的DailyRollingFileAppender每天生成一个日志文件,并在生成的日志文件之后添加日期作为标识,如wmts_2015-12-21.log。

试验期:

1、(小白入门)

log4j.properties配置如下

 log4j.appender.Info = org.apache.log4j.DailyRollingFileAppender
log4j.appender.Info.File = ${log4j.log.dir}/wmts_
log4j.appender.Info.DatePattern = yyyy-MM-dd'.log'
log4j.appender.Info.Append = false
log4j.appender.Info.Threshold = INFO
log4j.appender.Info.layout = org.apache.log4j.PatternLayout
log4j.appender.Info.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %c:%r ] - [ %p ] %m%n

原以为每次请求都会生成类似“wmts_2015-12-21.log”的文件,后来才知道当天的日志会先创建在“wmts_”文件中,第二天才会以前一天的日期生成日志文件。

但是经过多次的试验,一直没有生成正确命名的日志文件。

2、(C/S尝试)

(1)鉴于上面的试验一直没有成功,本人想到可能是本人的修炼还不够,一上手就用成型的项目可能有些问题不好发现,所以本人写了最简单的C/S的Demo来跟踪日志的生成。

log4j.properties的配置如下:

 log4j.appender.R1=org.apache.log4j.RollingFileAppender
log4j.appender.R1.file=C:/demo.log
log4j.appender.R1.layout=org.apache.log4j.PatternLayout
log4j.appender.R1.layout.conversionPattern=%d %c (%M:%L) - %m%n

生成日志文件正常。

(2)更改log4j.properties为项目的配置:

 log4j.appender.Info = org.apache.log4j.DailyRollingFileAppender
log4j.appender.Info.File = ${log4j.log.dir}/wmts_
log4j.appender.Info.DatePattern = yyyy-MM-dd'.log'
log4j.appender.Info.Append = true
log4j.appender.Info.Threshold = INFO
log4j.appender.Info.layout = org.apache.log4j.PatternLayout
log4j.appender.Info.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [ %c:%r ] - [ %p ] %m%n

再次生成日志文件,此时eclipse的console输出了错误代码log4j:ERROR Failed to rename [D:/logs/wmts_] to [D:/logs/wmts_2015-12-21.log ].

这个错误提示帮我最后解决了问题。

3、问题解决

引起log4j:ERROR Failed to rename的条件

通常都是在配置文件采用

 log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender  

或者

 log4j.appender.A1=org.apache.log4j.RollingFileAppender  
 

的情况下遇到"异常"提示。

原因:

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

源代码中使用renameTo将前一天的文件重命名为log4j.properties配置的文件名,但是有的时候该文件会被占用,导致无法进行重命名,才会报上一步的错误。

大神们的解决办法:在log4j中添加一个copy方法,在重命名前一天的日志文件时,将原文件拷贝一份,将拷贝的原文件命名为想要的文件名,来解决该问题。

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;
}
}

4、心得

  问题解决之后回想之前的解决过程,删除每次的日志文件的时候系统提示文件正在占用,停止eclipse的server之后才能删除文件,当时如果认真思考这个问题可能就会发现日志输出不正常的问题。于此给我敲响了警钟,要多思考一些系统给出的提示信息。

附上打包好的log4j-1.2.15.jar文件

http://files.cnblogs.com/files/giser-liang/log4j-1.2.15.zip

记一次log4j日志文件输出错误的解决的更多相关文章

  1. 记一次log4j日志文件小事故

    最近散仙在做公司的一个跟搜索有关的数据分析项目,主要就是统计搜索的转化率,目的主要有以下几个: (1)通过数据分析挖掘,找出搜索业务在整个平台系统里的GMV里所占份额 (2)给公司的搜索算法调优,提供 ...

  2. log4j日志文件输出保存

    og4j.appender.A1=org.apache.log4j.DailyRollingFileAppender log4j.appender.A1.File=app.log log4j.appe ...

  3. log4j日志文件乱码问题的解决方法

    近日在AIX上用log4j打印日志,出现乱码,经过努力解决问题. 症状:在默认语言非中文(或者说默认语言不支持中文的)的Windows.Linux.Unix上,用log4j打印日志,出现乱码,常见的就 ...

  4. Log4j 输出的日志中时间比系统时间少了8小时的解决方法,log4j日志文件重复输出

    1. 第一个问题:时间少了8小时 Log4j 输出的日志中,时间比系统时间少了8小时,但是 eclipse 控制台输出的日志的时间却是对的. log4j配置如下: #all logger output ...

  5. log4j日志整合输出(slf4j+commonslog+log4j+jdklogger)

    log4j日志整合输出(slf4j+commonslog+log4j+jdklogger) 博客分类: 日志   J2EE项目中,经常会用到很多第三方的开源组件和软件,这些组件都使用各自的日志组件,比 ...

  6. log4j 日志文件(Day_19)

    详细  :   https://www.cnblogs.com/liaojie970/p/7634838.html log4j  日志文件 1 log4j.rootLogger=debug,CONSO ...

  7. log4j将日志文件输出到相对路径

    建议直接使用jvm中定义的变量或者操作系统的环境变量. log4j.appender.logfile.File=${user.dir}/logs/app.log,使用tomcat容器时${user.d ...

  8. 使用logback.xml配置来实现日志文件输出

    转自:http://sungang-1120.iteye.com/blog/2104296 Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback- ...

  9. [ log4j ]-日志文件的使用

    在java文件中通过 log4j 输出日志信息 1,先引入 log4j-xx.x.jar 包 2,新建一个日志类 PrintLog4j.java: package com.stu.log4j; imp ...

随机推荐

  1. map(callback)

    将一组元素转换成其他数组(不论是否是元素数组) 你可以用这个函数来建立一个列表,不论是值.属性还是CSS样式,或者其他特别形式.这都可以用'$.map()'来方便的建立. 参数 callbackFun ...

  2. 【iOS开发】在 App 中加入 AdMob 广告 - 入门介绍与编程技巧

    前言 虽然在App中加入广告来盈利是比较低级的商业化方式,但对于个人开发者或者小团队开发者来说,做出一个简单易用的免费小工具(举个栗子),在里面加入一些广告,如果用的人多,也是可以带来一些可观的收入的 ...

  3. C# Winform中DataGridView绑定后DataGridViewCheckBoxColumn无法显示的问题

    在控件DataGridView绑定数据源后,发现DataGridViewCheckBoxColumn不能显示当前的check值.经过一番努力,现将完整代码奉献出来,仅供参考. 错误代码: /*禁止自动 ...

  4. redis 相关命令

    /etc/init.d/redis-serveredis-cli 进入redis/etc/init.d/redis-server stop /etc/init.d/redis-server start ...

  5. Docker 学习笔记(CentOS 7.1)

    基本概念 Docker 包括三个基本概念 镜像(Image) 容器(Container) 仓库(Repository)理解了这三个概念,就理解了 Docker 的整个生命周期. Docker 镜像 D ...

  6. ZJOI2007矩阵游戏

    题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作: 行交 ...

  7. Tomcat崩溃

    参考: http://bbs.csdn.net/topics/390391810?page=1 自己遇到的: --------------------------------------------- ...

  8. 求System.arraycopy的用法

    public class Shuzufuzhi { public static void main(String args[]) {  int myArray[]={1,2,3,4,5,6};  in ...

  9. XSS常用技巧

    一般发现一个xss漏洞后要做的基本上就是这些: 1. 伪造请求 使用$_REQUEST或$_GET 首先我们要找找该网站使用的程序是不是在网上能找到源码,如果能找到源码的话,就去分析后台管理员更改密码 ...

  10. Android studio Gradle 教程

    一 . Gradle基础:https://segmentfault.com/a/1190000002439306 module下的gradle文件: // 声明是Android程序 apply plu ...