Log4j создает пустой файл до того, как он понадобится

У меня есть приложение, которое запускается каждые 15 минут 23 часа в сутки. В большинстве случаев он «просыпается», видит, что данных для обработки нет, и закрывается. Во время инициализации и проверки входных данных есть операторы журнала DEBUG, которые записываются только на консоль. Только после того, как приложение нашло данные для обработки, оно записывает что-либо в файл журнала (уровень INFO и выше). Проблема в том, что прогоны «нет данных для обработки» создают пустые файлы журналов, даже если в них ничего не записывается. Поскольку он включается почти 100 раз в день, такое поведение нежелательно.

Я могу легко реализовать метод ручного удаления этих файлов, если они не нужны, но это кажется... хакерским. Есть ли способ заставить Log4j ждать создания файла журнала, пока в него что-то не будет записано? Спасибо!

Соответствующая часть log4j.properties:

log4j.appender.myFileLogger=org.apache.log4j.RollingFileAppender
log4j.appender.myFileLogger.Append=false
log4j.appender.myFileLogger.File=D:/Imaging/myApp/logs/myApp_${current.date}.log
log4j.appender.myFileLogger.threshold=INFO
log4j.appender.myFileLogger.layout=org.apache.log4j.PatternLayout
log4j.appender.myFileLogger.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

person jfaulk919    schedule 19.08.2016    source источник
comment
Вы могли бы удалить часть ЧЧ: мм: сс из вашего имени файла и иметь ежедневный журнал? Я думаю, что может быть полезно знать, что ничего не обрабатывалось, и, возможно, явно регистрировать это. Увы, мне жаль, что у меня нет ответа на ваш вопрос. Это интересно.   -  person dckuehn    schedule 19.08.2016
comment
Прокручивание ежедневных журналов было первоначальным решением, и я вполне могу вернуться к нему. Это странная настройка, так как входные данные доставляются тогда, когда это удобно, поэтому несколько входных файлов могут быть доставлены одновременно и обработаны последовательно. Надежда заключалась в том, чтобы получить один файл журнала для каждого запуска обработки/входного файла, но это незначительная проблема в любом направлении. В основном любопытство на данный момент :)   -  person jfaulk919    schedule 19.08.2016


Ответы (1)


Если кто-нибудь еще когда-нибудь столкнется с этим, вот как я «решил» это:

if(deleteLog) {
    FileAppender appender = (FileAppender)Logger.getRootLogger().getAppender("myFileLogger");
    String path = appender.getFile();
    Logger.shutdown();
    Files.delete(Paths.get(path));
}

Это все еще кажется немного хакерским, но работает без дополнительных точек конфигурации или жестко закодированных путей к файлам. Обязательно вызовите logger.shutdown(), иначе Log4j по-прежнему будет иметь открытый дескриптор файла, выдавая ошибку «другой процесс использует этот файл».

Ответ Бэзила Мусы послужил основой для этого: https://stackoverflow.com/a/9480213/5780475

person jfaulk919    schedule 19.08.2016