Как ограничить размер файла журнала в python

Я использую windows 7 и python 2.7. Я хочу ограничить размер файла журнала до 5 МБ. Мое приложение, когда оно начинается, записывает в файл журнала, а затем приложение завершается. Когда мое приложение запустится снова, оно будет записываться в том же файле журнала. Поэтому приложение не работает постоянно. Приложение инициирует, обрабатывает и завершает работу.

Мой код для ведения журнала:

import logging
import logging.handlers
logging.basicConfig(filename=logfile.log, level="info", format='%(asctime)s %(levelname)s %(funcName)s(%(lineno)d) %(message)s')
logging.info("*************************************************")

Я пробовал с RotatingFileHandler, но он не работал

logging.handlers.RotatingFileHandler(logFile, mode='a', maxBytes=5*1024*1024, backupCount=2, encoding=None, delay=0)

Итак, как я могу обеспечить ограничение размера файла в python?

Ответ 1

Потеряйте basicConfig и попробуйте следующее:

import logging
from logging.handlers import RotatingFileHandler

log_formatter = logging.Formatter('%(asctime)s %(levelname)s %(funcName)s(%(lineno)d) %(message)s')

logFile = 'C:\\Temp\\log'

my_handler = RotatingFileHandler(logFile, mode='a', maxBytes=5*1024*1024, 
                                 backupCount=2, encoding=None, delay=0)
my_handler.setFormatter(log_formatter)
my_handler.setLevel(logging.INFO)

app_log = logging.getLogger('root')
app_log.setLevel(logging.INFO)

app_log.addHandler(my_handler)

while True:
    app_log.info("data")

Это работает на моей машине

Ответ 2

Когда вы используете logging.basicConfig с файлом, журнал подключается с помощью обработчика файлов для обработки записи в файл. впоследствии вы создали другой файл-обработчик в тот же файл с logging.handlers.RotatingFileHandler

Теперь, когда требуется поворот, RotatingFileHandler пытается удалить старый файл, но он не может, потому что есть обработчик открытого файла

это можно увидеть, если вы посмотрите непосредственно на обработчики файлов журнала -

import logging
from logging.handlers import RotatingFileHandler

log_name = 'c:\\log.log'
logging.basicConfig(filename=log_name)
log = logging.getLogger()
handler = RotatingFileHandler(name,maxBytes=1024,backupCount=1)
log.addHandler(handler)


[<logging.FileHandler object at 0x02AB9B50>, <logging.handlers.RotatingFileHandler object at 0x02AC1D90>]