2017-01-31 6 views
0

Я использую logback, настроенный в файле logback.groovy, для управления журналами для моих приложений. Я хочу:Logback FileAppender, который использует один файл журнала и удаляет старые файлы журнала

  1. Создание файлов журналов, отмеченных при запуске приложения, и сохраняемых как один файл журнала на весь срок службы приложения. (У нас может быть несколько экземпляров приложения, работающего одновременно, или нескольких экземпляров, выполняемых в течение дня, и они могут выполняться в течение нескольких дней.)
  2. Храните чистый каталог файлов журналов, такой как журналы, которые старше определенного периода.

Достижение первой предложил бы использовать FileAppender, по следующим направлениям - однако, это не удаляет старые файлы журналов:

appender("FILE", FileAppender) { 
    file = "path/to/log/dir/log_file_${date}.log" 
} 

Достижение второй предложил бы использовать RollingFileAppender с TimeBasedRollingPolicy, по следующим строкам - который хранит файлы журнала в течение 7 дней. Тем не менее, это будет использовать один файл для регистрации всех экземпляров приложения на определенную дату, независимо от того, когда приложение было работать:

appender("FILE", RollingFileAppender) { 
    rollingPolicy(TimeBasedRollingPolicy) { 
     fileNamePattern = "path/to/log/dir/log_file_%d{yyyyMMdd}.log" 
     maxHistory = 7; 
    } 
} 

Как я могу иметь свой кусок пирога и съесть его - то есть получить преимущество один файл журнала на один запуск приложения (с отметкой времени запуска), но с историческими преимуществами очистки RollingFileAppender/TimeBasedRollingPolicy?

ответ

0

В той степени, что это может быть полезно, можно сделать это путем создания пользовательского FileAppender, по следующим направлениям:

public class TidyFileAppender<E> extends FileAppender<E> { 

    protected File directory; 

    @Override 
    public void start() { 
    if (conditions to determine historical files to be deleted) { 
     File[] oldFiles = directory.listFiles(new FileFilter() { 
     @Override 
     public boolean accept(File file) { 
      // return true if file is 'old' 
     } 
     }); 
     if (oldFiles != null) { 
     for (File oldFile : oldFiles) { 
      if (!oldFile.delete()) { 
      addWarn("Failed to delete old log file: " + oldFile); 
      } 
     } 
     } 
    } else { 
     addWarn("Cannot tidy historical logs..."); 
    } 
    super.start(); 
    } 
}