代码之家  ›  专栏  ›  技术社区  ›  Alan Krueger

干净利落地强制log4j rollingfileappender在午夜后滚动?

  •  3
  • Alan Krueger  · 技术社区  · 14 年前

    log4j rollingfileappender的正常行为是当第一条日志消息在不同的日期出现时滚动,但有些人会感到温暖和模糊,每个日期的日志文件都是空的,即使什么都没有发生。有没有办法强迫它在午夜后滚动而不向日志中写入假消息?

    1 回复  |  直到 14 年前
        1
  •  4
  •   Ari Gesher    14 年前

    我仔细看过这段代码——简单的答案是“不”。滚动是作为附加器上doappend()流的一部分触发的-触发它的唯一方法是记录一些东西。

    你可以用cron伪造这个:让cron脚本在11:58左右触摸明天的文件。这将使您得到您正在寻找的空日志文件行为。

    下面是实现滚动功能的代码:

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