2015-09-08 2 views
0

Интересно, почему я поднял исключение между выводом отладки журнала?Как сделать выходные сообщения log4r синхронными?

DEBUG: asdjoasjd 
    DEBUG: asdjoasjd 
    DEBUG: asdjoasjd 
    **RuntimeError: something** 
    DEBUG: continued debug message 
    DEBUG: continued debug message 
    DEBUG: continued debug message 

В то время как это сообщение отладки было составлено до исключения?

$stdout.sync = true не помогло.

я использую log4r

ответ

1

Из документации IO#sync:

Когда режим синхронизации верно, все выходные данные немедленно сбрасываются на основной операционной системы и не буферном внутренне.

Это означает, что Ruby не будет буферизовать данные внутри. К сожалению, это не означает ничего о буферизации ОС, и ОС может также буферизовать данные.

Также обратите внимание, что Log4r использует IO#flush для очистки данных, что гарантирует, что данные будут очищены до базовой ОС, но не более того.

Сбрасывает любые буферизованные данные в пределах iOS в базовую операционную систему (обратите внимание, что это только внутренняя буферизация Ruby, а также может буферизовать данные).

Что вам нужно, это IO#fsync, который сразу же записывает (сбрасывает) все буферизованные данные.

Сразу же записывает все буферизованные данные в ios на диск. Обратите внимание, что fsync отличается от использования IO # sync =. Последнее гарантирует, что данные будут удалены из буферов Ruby, но не гарантирует, что базовая операционная система фактически записывает их на диск.

Вы можете подкласса Log4r::StdoutOutputter и предоставить свои собственные #write.

Пример:

module Log4r 
    class SyncedStdoutOutputter < StdoutOutputter 
    def write(data) 
     super(data) 
     @out.fsync 
    rescue NotImplementedError 
     # fsync not supported by this OS 
    end 
    end 
end 

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

В личной заметке, я думаю, Log4r устарел и немного неактивен. Я пытаюсь придерживаться либо родного Logger, либо не менее ActiveSupport::Logger (который в основном предоставляет форматтер). Посмотрите на более современные альтернативы, такие как logging. Большинство регистраторов взаимозаменяемы.

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