log4j集成到了原来的日志输出类中,仅用做日志文件输出配置如下:
log4j.rootLogger=A2log4j.appender.A2=org.apache.log4j.RollingFileAppenderlog4j.appender.A2.File=C:/test/log4j/info.log     <-----  关键是这里log4j.appender.A2.MaxFileSize=20KBlog4j.appender.A2.MaxBackupIndex=100log4j.appender.A2.Append=falselog4j.appender.A2.layout=org.apache.log4j.PatternLayoutlog4j.appender.A2.layout.ConversionPattern=%m%n======================================
问题如下
1.指定的日志存放路径是 C:/test/log4j/info.log
但是我想动态生成时间日期文件夹,比如
C:/test/log4j/2008/01/02/info.log
C:/test/log4j/2008/01/02/info2.log
C:/test/log4j/2008/01/02/info3.logC:/test/log4j/2008/01/03/info.logC:/test/log4j/2008/02/14/info.log
这个如何在代码里实现,看过类似的动态路径C:/{filepath}/info.log,但也是一次性的,就是{filepath}一被指定,还是不变的2.动态日志文件编号问题
如上配置生成的动态文件一旦超过20KB,则新文件是
info.log.1
info.log.2
info.log.3
...
...我如何更改是新文件名为
info.log
info2.log
info3.log
...
...直接通过log4j的方式编号文件

解决方案 »

  1.   

    org/apache/log4j/RollingFileAppender.java
    修改target 的命名  public // synchronization not necessary since doAppend is alreasy synched
      void rollOver() {
        File target;
        File file;    LogLog.debug("rolling over count=" + ((CountingQuietWriter) qw).getCount());
        LogLog.debug("maxBackupIndex="+maxBackupIndex);    // If maxBackups <= 0, then there is no file renaming to be done.
        if(maxBackupIndex > 0) {
          // Delete the oldest file, to keep Windows happy.
          file = new File(fileName + '.' + maxBackupIndex);
          if (file.exists())
           file.delete();      // Map {(maxBackupIndex - 1), ..., 2, 1} to {maxBackupIndex, ..., 3, 2}
          for (int i = maxBackupIndex - 1; i >= 1; i--) {
    file = new File(fileName + "." + i);
    if (file.exists()) {
      target = new File(fileName + '.' + (i + 1));
      LogLog.debug("Renaming file " + file + " to " + target);
      file.renameTo(target);
    }
          }      // Rename fileName to fileName.1
          target = new File(fileName + "." + 1);      this.closeFile(); // keep windows happy.      file = new File(fileName);
          LogLog.debug("Renaming file " + file + " to " + target);
          file.renameTo(target);
        }    try {
          // This will also close the file. This is OK since multiple
          // close operations are safe.
          this.setFile(fileName, false, bufferedIO, bufferSize);
        }
        catch(IOException e) {
          LogLog.error("setFile("+fileName+", false) call failed.", e);
        }
      }
      

  2.   

    有难度啊,我觉得你可以用Timer来动态生成按时间日期的文件夹,但问题怎么将log4j.appender.A2.File=C:/test/log4j/info.log改成动态的,像这样C:/{filepath}/info.log,看接下来有朋友想出好的办法吗?(其实可以使用Maven2 和 Ant来copy,但是多了步骤,麻烦);至于你那个: 2.动态日志文件编号问题 ,没必要吧,把log4j.appender.A2.MaxFileSize=20KB , MaxFileSize设大点,没什么事吧。
    PS.继续关注....
      

  3.   

    我之所以这么做,是想通过静态网页形式来浏览运行信息,可以这么实现<div>调试信息:</div>
    <div><ifram src="http://www.xxx.com/xxx/2008/02/01/infolog1.html"></ifram></div>
    <div><tt onclick="goPage(-1);">上一页</tt><tt onclick="goPage(1)">下一页</tt></div><ifram src="http://www.xxx.com/xxx/2008/02/01/infolog1.html"></ifram>
    这个ifram的 src通过Js脚本赋值,这样实现分页,调试信息直接附加页面样式
    logger.info("<div style="color:darkblue;font-size:12px">"+log+"</div>");infolog1.html:
    <div style="color:darkblue;font-size:12px">输出的信息1</div>
    <div style="color:darkblue;font-size:12px">输出的信息2</div>
    <div style="color:darkblue;font-size:12px">输出的信息3</div>
    <div style="color:darkblue;font-size:12px">输出的信息4</div>其实log4j有个DailyRollFileXXXXXXX的输出方式,就是按每天的方式输出,不清楚是不是2008/01/02/info1.html这样的输出部署,按日期文件夹分类日志便于查看信息和删除信息感谢waterborn指出的源代码位置.
    哪个日期分类文件夹有时间在看看
      

  4.   

    文件编号:log4j-1.2.15
    RollingFileAppender.java类
    public // synchronization not necessary since doAppend is alreasy synched
      void rollOver() {
        File target;
        File file;
        
      int p=fileName.indexOf(".");                           <---- 1
    String fileL=fileName.substring(0,p);            <---- 2
    String fileR=fileName.substring(p+1);            <---- 3

        if (qw != null) {
            long size = ((CountingQuietWriter) qw).getCount();
            LogLog.debug("rolling over count=" + size);
            //   if operation fails, do not roll again until
            //      maxFileSize more bytes are written
            nextRollover = size + maxFileSize;
        }
        LogLog.debug("maxBackupIndex="+maxBackupIndex);    boolean renameSucceeded = true;
        // If maxBackups <= 0, then there is no file renaming to be done.
        if(maxBackupIndex > 0) {
          // Delete the oldest file, to keep Windows happy.
          file = new File(fileL+maxBackupIndex+"."+fileR);
          if (file.exists())
           renameSucceeded = file.delete();      // Map {(maxBackupIndex - 1), ..., 2, 1} to {maxBackupIndex, ..., 3, 2}
          for (int i = maxBackupIndex - 1; i >= 1 && renameSucceeded; i--) {
    file = new File(fileL+i+"."+fileR);
    if (file.exists()) {
      target = new File(fileL+(i+1)+"."+fileR);
      LogLog.debug("Renaming file " + file + " to " + target);
      renameSucceeded = file.renameTo(target);
    }
          }    if(renameSucceeded) {
          // Rename fileName to fileName.1
          target = new File(fileL+"1."+fileR);      this.closeFile(); // keep windows happy.      file = new File(fileName);
          LogLog.debug("Renaming file " + file + " to " + target);
          renameSucceeded = file.renameTo(target);
          //
          //   if file rename failed, reopen file with append = true
          //
          if (!renameSucceeded) {
              try {
                this.setFile(fileName, true, bufferedIO, bufferSize);
              }
              catch(IOException e) {
                LogLog.error("setFile("+fileName+", true) call failed.", e);
              }
          }
        }
        }    //
        //   if all renames were successful, then
        //
        if (renameSucceeded) {
        try {
          // This will also close the file. This is OK since multiple
          // close operations are safe.
          this.setFile(fileName, false, bufferedIO, bufferSize);
          nextRollover = 0;
        }
        catch(IOException e) {
          LogLog.error("setFile("+fileName+", false) call failed.", e);
        }
        }
      }就这样了,目录哪个找不到源代码,结帖