Не совсем.Он сбрасывает каждое отдельное сообщение, что вам и нужно.
FileHandler наследуется от StreamHandler.StreamHandler вызывает self.flush () после каждой записи () в поток.
Метод flush () начинает приобретать больше смысла, если вы посмотрите на logging.MemoryHandler
.Для программ, которые хотят добавить буферизацию, MemoryHandler позволяет обернуть другой обработчик и буферизовать определенное количество сообщений.Он также немедленно сбрасывается в сообщениях выше установленного уровня серьезности.logging
не включает обработчик, который автоматически сбрасывает каждую секунду или около того, но вы всегда можете написать его самостоятельно.
Сброс вызовов в StreamHandler также означает, что он делает то, что вы хотите,если ваша программа запущена как systemd
служба и вы регистрируетесь на stderr
.В этом случае Python 3 требует сброса.Python 3 в настоящее время использует блочную буферизацию для stderr, когда это не TTY.См. обсуждение проблемы Python 13597
Возможная причина моей ошибки
Я думаю, что меня смутил код StreamHandler.Если пользователю никогда не требовалось вызывать метод flush (), зачем StreamHandler определять непустую, публично документированную реализацию?
Я думаю, что предполагал слишком много, и я не учел наследование (argh) используется здесь.Например, базовый класс Handler имеет пустой метод flush (), но StreamHandler не хочет наследовать его, потому что у него странная строка документации «Эта версия ничего не делает и предназначена для реализации подклассами».