记一次log4j日志文件输出错误的解决

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配置如下

1 log4j.appender.Info = org.apache.log4j.DailyRollingFileAppender
2 log4j.appender.Info.File = ${log4j.log.dir}/wmts_
3 log4j.appender.Info.DatePattern = yyyy-MM-dd‘.log‘
4 log4j.appender.Info.Append = false
5 log4j.appender.Info.Threshold = INFO
6 log4j.appender.Info.layout = org.apache.log4j.PatternLayout
7 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的配置如下:

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

生成日志文件正常。

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

1 log4j.appender.Info = org.apache.log4j.DailyRollingFileAppender
2 log4j.appender.Info.File = ${log4j.log.dir}/wmts_
3 log4j.appender.Info.DatePattern = yyyy-MM-dd‘.log‘
4 log4j.appender.Info.Append = true
5 log4j.appender.Info.Threshold = INFO
6 log4j.appender.Info.layout = org.apache.log4j.PatternLayout
7 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的条件

通常都是在配置文件采用

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

或者

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

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

原因:

1 File file = new File(fileName);
2     boolean result = file.renameTo(target);
3     if(result) {
4       LogLog.debug(fileName +" -> "+ scheduledFilename);
5     } else {
6       LogLog.error("Failed to rename ["+fileName+"] to ["+scheduledFilename+"].");
7     }

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

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

copy方法的代码如下:

 1 /**
 2      * Copies src file to dst file. If the dst file does not exist, it is
 3      * created.8KB cache
 4      *
 5      * @param src
 6      * @param dst
 7      * @throws IOException
 8      */
 9     boolean copy(File src, File dst) throws IOException {
10         try {
11             InputStream in = new FileInputStream(src);
12
13             OutputStream out = new FileOutputStream(dst);
14
15             // Transfer bytes from in to out
16             byte[] buf = new byte[8192];
17             int len;
18             while ((len = in.read(buf)) > 0) {
19                 out.write(buf, 0, len);
20             }
21             in.close();
22             out.close();
23             return true;
24         } catch (FileNotFoundException e) {
25             LogLog.error("源文件不存在,或者目标文件无法被识别." );
26             return false;
27         } catch (IOException e) {
28             LogLog.error("文件读写错误.");
29             return false;
30         }
31     }

4、心得

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

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

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

时间: 2024-10-23 19:15:58

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

记一次log4j日志文件小事故

最近散仙在做公司的一个跟搜索有关的数据分析项目,主要就是统计搜索的转化率,目的主要有以下几个: (1)通过数据分析挖掘,找出搜索业务在整个平台系统里的GMV里所占份额 (2)给公司的搜索算法调优,提供可靠的参考依照 (3)了解从搜索入口到最终交易之间各个阶段的数据比重,主要有搜索点击率,搜索曝光率,搜索添加购物车率,搜索下单率,搜索支付率,以及最终的成交金额等 当然还有其他的一些比较细的数据,这里就不细说了,今天,记录一个比较低级的问题,散仙在自己的web项目发现log4j记录的日志文件竟然找不

log4j日志文件输出保存

og4j.appender.A1=org.apache.log4j.DailyRollingFileAppender log4j.appender.A1.File=app.log log4j.appender.A1.DatePattern='.'yyyy-MM-dd log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d %5p - %c -%-4r

mono 3.4.0 make install的时候出现"找不到 Microsoft.Portable.Common.targets 文件”的错误提示解决方法

如果在这时就进行配置安装Mono的话,会在make阶段得到一个“找不到 Microsoft.Portable.Common.targets 文件”的错误提示, 所以需要先进行如下处理: #> cd (mono安装路径的前缀)/mono-3.4.0/mcs/tools/xbuild/targets #> cp Microsoft.Portable.CSharp_4.0.targets Microsoft.Portable.Common.targets #> vim Microsoft.Po

通过assets像安卓程序目录中导入数据库文件出现错误的解决办法

错误提示如下,下面的错误信息 08-13 07:36:31.396: W/System.err(9814): java.io.IOException 08-13 07:36:31.416: W/System.err(9814):  at android.content.res.AssetManager.readAsset(Native Method) 08-13 07:36:31.416: W/System.err(9814):  at android.content.res.AssetMana

【Java】【16】log4j日志的输出级别

正文:日志输出的级别,主要有以下几种:(1)ALL:打印各级日志信息包括自定义级别(2)TRACE:最详细的信息.一般这些信息只记录到日志文件中.自版本1.2.12[3](3)DEBUG:流经系统的详细信息.一般这些信息只记录到日志文件中(4)INFO:令人感兴趣的运行时事件(启动/关闭).一般这些信息将立即呈现在状态控制台上,因而要保守使用,并保持到最低限度.(5)WARN:使用已过时的API,API的滥用,潜在错误,其他不良的或意外的运行时的状况(但不一定是错误的).一般这些信息将立即呈现在

JAVA log4j日志文件使用

//1.导入jar包,log4j-1.2.17.jar//2.src下创建log4j.properties文件//3.配置properties文件/*log4j.rootLogger(默认是对整个工程生效)=DEBUG,stdout(控制台),a, b, -日志级别(ALL<DEBUG<INFO<WARN<ERROR<FATAL<OFF)log4j.logger.com.hutu=info, stdout,表示该日志只对package com.hutu生效 log4j.

记一次Log4j2日志无法输出的 心酸史

问题描述:部分日志无法输出到日志文件中. 项目中的代码: @Resource private ConfigInfo configInfo; private static final Logger logger = Logger.getLogger(UdmpUtil.class); @PostConstruct public void initialize() { try { logger.info("log write...."); UdmpConfig.init(configInfo

log4j日志文件 log4j.xml log4j.properties配置

1,导入log4j  jar包; 2,配置log4j.xml或log4j.properties文件; ----------------------------------------------------------------------------------------------------------- <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuratio

使用log4net将日志文件输出为csv格式

我们在编写程序时,会在程序运行过程中记录一些日志.log4net作为一款经久耐用的日志组件,值得我们信赖.在中小型公司中,往往没有专业的日志服务器来处理应用程序产生的日志,而格式化不好的日志文件又为上线后日志的统计.分析.查找造成了困难. Excel作为一款常用的办公软件,用来处理一些中小数量级的数据还是游刃有余的.如果log4net输出的日志能够直接导入Excel,那么查询和分析起来岂不是要快很多? 我们有很多方法可以实现这个功能,csv的优势是其文件格式比较简单,可以用任意的文本编辑器打开,