Сколько файловых дескрипторов открывает регистратор RotatingFileHandler в python?

Допустим, я создаю вращающийся файловый регистратор с python, используя RotatingFileHandler. Я установил количество файлов равным 10, а размер каждого файла - 1 МБ. Мой вопрос связан с тем, как происходит вращение. Является ли это вращением, когда все 10 файлов открыты и содержимое каждого файла изменено по мере добавления строки в последний файл? Если это так, то должно быть не менее 10 файловых дескрипторов, которые всегда открыты.

Скажем, у каждого файла есть 100-килобайтные чанки, поэтому у каждого есть всего 10 строк. Поэтому, когда через этот обработчик ротационных журналов вставляется еще одна строка (размером 100 КБ), разве последняя строка каждого файла не помещается вверху следующего файла (от нового к старому)? Так что имеет смысл держать все файловые дескрипторы открытыми все время, не так ли?

1 ответ

У обработчика только один открытый файл. Другие файлы переименовываются при вращении.

Во-первых, текущий файл закрыт. Затем вращение переименовывает файлы в обратном порядке; так что файл с расширением .9 переименован в .10 во-первых, удаление уже существующего .10 если это там. затем .8 переименован в .9и т. д. Наконец, "текущий" файл переименовывается, чтобы добавить .1 расширение.

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

Все это включено в logging.handlers.RotatingFileHandler() документация

Когда размер будет превышен, файл закрывается, и новый файл автоматически открывается для вывода. [...] Если значение backupCount отличное от нуля, система сохранит старые файлы журнала, добавив к имени файла расширения ".1", ".2" и т. Д. Например, с параметром backupCount 5 и именем базового файла app.log вы получите app.log, app.log.1, app.log.2, вплоть до app.log.5, Файл для записи всегда app.log, Когда этот файл заполнен, он закрывается и переименовывается в app.log.1 и если файлы app.log.1, app.log.2 и т. д. существуют, то они переименовываются в app.log.2, app.log.3 и т.д. соответственно.

Другие вопросы по тегам