Ограничить размер файла журнала при ведении журнала на Python

#python #logging

#python #ведение журнала

Вопрос:

Ограничение размера файла журнала в python, насколько я могу судить, может быть выполнено с RotatingFileHandler помощью атрибута and it maxBytes .

Чтобы проверить это, я написал следующий скрипт:

 import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger("Rotating Log")
logger.setLevel(logging.INFO)

# add a rotating handler
handler = RotatingFileHandler("test.log", maxBytes=1)
logger.addHandler(handler)

x = 0
while True:
    x  = 1
    logger.info(x)
  

Несмотря на то, что размер файла журнала не должен превышать 1 байт, он довольно быстро увеличивается до многих мегабайт. Как я могу это ограничить? К сожалению, документация довольно плохая. Я также хотел знать, как убедиться, что каждый раз, когда я перезапускаю скрипт python, файл журнала очищается и запускается заново, однако в документе просто говорится

 class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False)

If mode is not specified, 'a' is used. 
  

Однако в нем не указано, какие другие варианты вместо ‘a’ существуют.

Подводя итог вопросам

  1. Как я могу ограничить размер файла журнала, скажем, 10 мегабайтами
  2. Как я могу обеспечить запуск нового файла журнала, если скрипт запущен, а не добавлен старый

Редактировать: я попробовал это с maxBytes = 1000000, но результат остался прежним. Файл журнала продолжает увеличиваться

Комментарии:

1. Я бы не ожидал maxBytes=1 , что когда- нибудь сработает. Ведение журнала основано на строках, а не на символах. Это может быть просто недопустимым параметром, поскольку практически любое сообщение журнала уже превысит максимальный размер. Получаете ли вы такое же поведение, если задаете более разумное maxBytes значение?

2. Я только что попробовал это с maxBytes = 1000000 (1 мегабайт) и увеличил размер строки, чтобы немного ускорить ее. Он увеличился до 1,1 ГБ, прежде чем я прервал. The

Ответ №1:

Вы можете проверить 2-й раздел класса RotatingFileHandler

Ролловер происходит всякий раз, когда длина текущего файла журнала составляет почти макСбайт; но если любой из макСбайт или backupCount равен нулю, ролловер никогда не происходит, поэтому обычно требуется установить backupCount как минимум на 1 и иметь ненулевой maxBytes .

Похоже, вы не установили backupCount значение.

Когда backupCount не равен нулю, система сохранит старые файлы журнала, добавив расширения ‘.1’, ‘.2’ и т.д. К имени файла.

Например, при резервном кол-ве 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 и т. Д. Соответственно.