Есть ли разница между RotatingFileHandler и logrotate.d + WatchedFileHandler для ротации журнала Python?

У Python есть собственный RotatingFileHandler, который должен автоматически чередовать файлы журналов. Как часть приложения Linux, которому нужно будет менять файл журнала каждые пару недель/месяцев, мне интересно, отличается ли он от файла конфигурации в logrotate.d и вместо этого использует WatchedFileHandler.

Есть ли разница в том, как они работают? Является ли один метод безопаснее, эффективнее или лучше другого?


person devhallo    schedule 17.03.2015    source источник
comment
logrotate.d зависит от закрытия и повторного открытия регистратором своего указателя файла для каждого события журнала. Я не уверен, делает ли это стандартный файловый регистратор Python.   -  person tdelaney    schedule 17.03.2015
comment
@tdelaney это не так, но внутри logging есть хорошая альтернатива, см. конец моего ответа   -  person loopbackbee    schedule 17.03.2015
comment
Я заметил, что вы отредактировали свой вопрос, упомянув WatchedFileHandler. Вы имели в виду RotatingFileHandler?   -  person loopbackbee    schedule 19.03.2015
comment
нет. WatchedFileHandler используется с logrotate. RotatingFileHandler отвечает за ротацию журналов и заменяет logrotate.   -  person devhallo    schedule 19.03.2015


Ответы (2)


Какова целевая аудитория вашей программы?

Если вы создаете настольное приложение, и нельзя ожидать, что большинство пользователей будут читать журналы, вы должны сделать это за них. Не только ротация, но и удаление старых — вы не хотите чтобы заполнить жесткий диск бедного пользователя!

С другой стороны, если аудитория состоит из опытных системных администраторов UNIX, вам придется использовать другой подход.

Системным администраторам потребуются функции, о которых вы даже не подозреваете. Отправляйте их по электронной почте, записывайте их в хранилище только для добавления и так далее. Для этой аудитории лучше всего, если ваша регистрация будет максимально гибкой. Гибкость (в UNIX) означает простоту — так что просто запишите в файл и считайте, что дело сделано.

Кроме того, системные администраторы не хотят заново учиться вести журналы заново. Даже если вы хотите предоставить такую ​​функцию, убедитесь, что значение по умолчанию является разумным в рамках этого предположения.

Окончательно. tdelaney поднял важный вопрос: стандартный FileHandler не обращает особого внимания на файл, в который он пишет. Вы должны использовать WatchedFileHandler, который был написан специально для этой цели.

person loopbackbee    schedule 17.03.2015
comment
Это хороший аргумент в пользу обработчиков syslog и NTEventLog, которые регистрируются в ожидаемых местах. Приложение не должно иметь права на запись в \var\log, но все равно может записывать туда свои журналы с помощью стандартных вызовов системного журнала. - person tdelaney; 17.03.2015
comment
Хороший вопрос, хотя это не относится непосредственно к моему вопросу. Но я предполагаю, что вы имеете в виду, что опытные пользователи * nix ожидают, что механизм ротации журналов будет обрабатываться logrotate, если вообще будет? - person devhallo; 17.03.2015
comment
@tdelaney syslog и NTEventLog действительно лучший выбор, если вы хотите явно писать код для разных платформ. - person loopbackbee; 17.03.2015
comment
@devhallo да, это моя точка зрения. Нередко демон выполняет вращение, но это неудобно. Какие аспекты вашего вопроса, по вашему мнению, здесь не рассматриваются? - person loopbackbee; 17.03.2015
comment
@goncalopp ваш ответ только описывает то, как программист должен думать о ведении журнала, в зависимости от целевой аудитории. Это не отвечает на вопрос, использовать ли инструмент RotatingFileHandler или logrotate Python, поскольку оба они могут использоваться для выполнения одной и той же задачи. Я принял его, хотя, поскольку ваш комментарий проясняет ситуацию, но вы можете отредактировать его, чтобы напрямую ответить на вопрос для дальнейшего использования. - person devhallo; 19.03.2015
comment
Не исключено, что вам может потребоваться действие при ротации журнала (например, перезапуск rsyslog). Я не уверен, возможно ли это с фреймворком ведения журнала Python; это основная функциональность logrotate. - person Ben; 02.03.2017

RotatingFileHandler позволяет файлу журнала увеличиваться до размера N, а затем немедленно и автоматически превращается в новый файл.

logrotate.d обычно запускается один раз в день. Если вы хотите ограничить размер файла журнала, logrotate.d не самый полезный, поскольку он запускается только периодически.

person mbrandeis    schedule 17.03.2015
comment
Следует отметить, что у logrotate есть параметр размера, который будет вращать журнал, как только он достигнет/превысит установленный размер. Справочный сайт: thegeekstuff.com/2010/07/logrotate-examples - person Angry 84; 07.01.2016
comment
Но logrotate по-прежнему будет выполнять ротацию только тогда, когда она запускается в установленное время. Таким образом, существует период задержки, в течение которого журнал может продолжать расти. Изменение logrotate для ежечасного запуска, конечно, несколько смягчит это. - person pfctdayelise; 07.03.2016