2014-10-31 7 views
1

Мы используем log4j 1.2.17 через slf4j-log4j12 1.7.7 с Java 8. Я запускаю приложение из Eclipse 4.4.1 на Windows 7 Professional 64-bit ,log4j RollingFileAppender не записывается в журнал до закрытия приложения

Наш файл корневой log4j.properties выглядит следующим образом:

# Root logger option 
log4j.rootLogger=INFO, stdout 

# Direct log messages to stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p (%c{1}) [%d] - %l: %m%n 

В приложении мы создали качению файл Appender, основанный на конфигурации:

EnhancedPatternLayout patternLayout = new EnhancedPatternLayout("%-5p (%c{1}) [%d] - %l: %m%n"); 
RollingFileAppender rollingFileAppender = new RollingFileAppender(patternLayout, logPath, true); 
rollingFileAppender.setMaxBackupIndex(5); 
rollingFileAppender.setMaxFileSize(5MB); 
Logger.getRootLogger().addAppender(rollingFileAppender); 

Это работает хорошо ... когда приложение наконец, закрыта! Пока приложение работает, файл журнала находится на нулевом байте, что не очень полезно.

(В этой версии нашего приложения мы перешли от использования прямого log4j с использованием slf4j-> log4j Я не помню навскидку, если поведение было по-другому, прежде чем мы перешли.).

Обновления: Я прослеживается через создание настоящего писателя. log4j создает FileOutputStream, а затем обертывает его в OutputStreamWriter, который затем обертывается в CountingQuietWriter, который вызывается приложением. Флаг bufferedIO выключен. Я также проследил, записав сообщение журнала, и он, кажется, записывается нормально на CountingQuietWriter ->OutputStreamWriter ->FileOutputStream. Однако ничего не появляется в файле журнала, пока я не закрою приложение.

Почему приложение не записывается в журнал немедленно или, по крайней мере, так часто после заполнения буфера?

+0

Humm ... Это отлично работает для меня. Я использую Windows 7 с Java 8 и slf4j 1.7.7 –

+0

Работает ли это, если вы настраиваете этот appender в log4j.properties? – ToYonos

+0

Являются ли эти журналы из приложения или из тестов? Если из тестов вы запускаете их из уверенного/отказоустойчивого? У меня была такая же проблема из-за параллельных тестов выполнения в приложении, что помогло изменить конфигурацию safefire/failafe. –

ответ

0

По моему опыту, это вполне может быть просто проблемой вашей ОС/файловой системы/хранилища/etc или приложением, используемым вами для просмотра размера файла, а не для извлечения/репликации/обновления метаданных файлов ... и данных на самом деле может быть там. Например, файловая система может реплицировать/сообщать метаданные после блокировки записи.

Когда вы открываете файл (только для чтения) во время работы приложения, вы видите данные, несмотря на размер файла с сообщением?

+0

Нет, когда я открываю файл во время работы приложения, я не вижу данных. –

+0

Хорошо, тогда ... теперь я испытаю это :), какую ОС и файловую систему вы используете? –

+0

Я только что тестировал на Win7/NTFS и ubuntu ext3 fs, оба работали ... WIN7/NTFS, как я уже упоминал, не отражает размер метаданных файлов, но когда я открыл его только для чтения, все сообщения журнала действительно были там.В конце концов, метаданные действительно обновили. Просто дайте мне знать информацию об окружающей среде, и я посмотрю, что я могу сделать, чтобы проверить. –

0

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

rollingFileAppender.setImmediateFlush(true); 
rollingFileAppender.setBufferedIO(false); 

Странно то, что эти значения по умолчанию один, но вы можете попробовать его в любом случае.

+0

Я обновил вопрос после проверки того, что флаг 'bufferedIO' выключен, даже отслеживая код. –

+0

Работает ли он, если вы настраиваете этот appender в log4j.properties? – ToYonos

Смежные вопросы