Чисто заставить Log4j RollingFileAppender катиться вскоре после полуночи? - PullRequest
3 голосов
/ 03 ноября 2010

Обычным поведением Log4j RollingFileAppender является бросок, когда первое сообщение журнала появляется в другой день, но некоторые чувствуют себя тепло и нечетко с пустыми файлами журналов для каждой даты, даже если ничего не произошло.Есть ли способ заставить его катиться после полуночи без записи фиктивных сообщений в журнал?

1 Ответ

4 голосов
/ 03 ноября 2010

Я очень внимательно посмотрел на этот код - простой ответ «нет».Ролловер запускается как часть потока doAppend () на Appender - единственный способ вызвать это - записать что-либо.

Вы можете подделать это с помощью 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;
  }
...