分享

Java log4j配置每天生成一个日志文件 - 永恒ぃ☆心 的日志 - 网易博客

 欢欢2008 2010-10-28

一、配置属性文件log4j.properties

log4j.rootLogger=INFO,stdout,R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss} %5p [%t] (%F\:%L) - %m%n

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=/home/log/system
log4j.appender.R.DatePattern ='.'yyyy-MM-dd'.log'
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss} [%c]-[%p] [%t] (%F\:%L) ->%m %n

二、项目初始化log4j

PropertyConfigurator.configure(log4j);

.......

此步骤略。

三、修改log4j源代码中DailyRollingFileAppender.java文件。

将log4j的源文件加入项目中。修改:

/**
  * 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);
  boolean result = copy(file, 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;
 }

修改删除黄色代码,并添加蓝色代码。

并加入方法copy。

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

原因:

如果不修改DailyRollingFileAppender中的renameTo方法,发报错:Log4j的log4j:ERROR Failed to rename错误。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多