Приложение файла журнала не сбрасывается сразу

В некоторых случаях мне нужно немедленно принудительно очистить приложение файла журнала. Я нашел в документах , что эта опция включена по умолчанию. Таинственным образом это не работает. Как я вижу в источниках, в основу процесса вовлекается BufferedOutputSreamправильно. Есть ли проблемы с BufferedOutputSream.flush()? Вероятно, это скорее связано с проблемой промывки.

Обновление: Я обнаружил проблему в Windows XP Pro SP 3 и Red Hat Enterprise Linux Server версии 5.3 (Tikanga ). Я использовал эти библиотеки:

jcl-over-slf4j-1.6.6.jar
logback-classic-1.0.6.jar
logback-core-1.0.6.jar
slf4j-api-1.6.6.jar

logback.xmlэто:


    
        /somepath/file.log
        
            file.log.%i
            1
            3
        
        
            5MB
        
        
            %d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n
        
    

    
        
    

Обновлено: Я бы предоставил модульный тест, но это кажется не таким уж простым. Позвольте мне более четко описать проблему.

  1. Произошло событие регистрации
  2. Событие передается в файл appender
  3. Событие сериализуется по определенному шаблону
  4. Сериализованное сообщение о событии передается в приложение файла и собирается записать в выходной поток
  5. Запись в поток закончена,выходной поток сбрасывается (проверил реализацию ). Заметим, что immidiateFlushверно по по умолчанию, поэтому метод flush()вызывается явно
  6. Нет результата в файле!

Чуть позже, когда какой-то базовый буфер был заполнен, событие появляется в файле. Итак, вопрос :в том, гарантирует ли выходной поток немедленную очистку?

Честно говоря, я уже решил эту проблему, реализовав свой собственный ImmediateRollingFileAppender, который использует возможность FileDescriptorнемедленной синхронизации. Любой, кому это интересно, может подписаться на это .

Так что это не проблема журнала.

16
задан Community 23 May 2017 в 11:46
поделиться