Из документации 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. Большинство регистраторов взаимозаменяемы.