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

#python #logging #filehandler #log-files

#python #ведение журнала #logfile #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. RotatingFileHandler — это правильный путь. Как именно это не сработало?

2. может быть, потому, что приложение не работает непрерывно или есть какие-то ошибки в кодировании

3. Это не отвечает на мой вопрос 🙂 Я не прошу вас размышлять о том, почему это так, но ЧТО именно не так с RotatingFileHandler. Ошибки, исключения, сбои, что угодно? Он вообще записывает в журнал?

4. @imp не имеет значения, сколько раз он прерывается. Смотрите getLogger . Он всегда будет возвращать ссылку на один и тот же регистратор

Ответ №1:

Потеряйте basicConfig() и используйте RotatingFileHandler:

 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")
  

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

1. просто работайте в текущем файле py, как заставить его работать в других файлах py

2. @geosmart logging.getLogger('root').info('some log') в любом файле Python должно работать

3. Для Python 3 не забудьте обновить флаг задержки с 0 до False. Это может выглядеть как целое число, но на самом деле это логический параметр.

Ответ №2:

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

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

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

 import logging
from logging.handlers import RotatingFileHandler

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


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

Ответ №3:

Чтобы использовать basicConfig и RotatingFileHandler, добавьте RotatingFileHandler в качестве обработчика в basicConfig.

main.py:

 import logging

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

logging.basicConfig(
    level=logging.DEBUG,
    format="%(asctime)s %(name)-25s %(levelname)-8s %(message)s",
    datefmt="%y-%m-%d %H:%M:%S",
    handlers=[
        rfh
    ]
)

logger = logging.getLogger('main')

logger.debug("test")
  

other.py

 import logging

class Other():
    def __init(self):
        self.logger = logging.getLogger('other')
        self.logger.info("test2")
  

«тест» будет записан в foo.журнал с тегом ‘main’

«test2» будет записан в foo.регистрируйте с тегом ‘other’

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

1. Нет записи в foo. у меня происходит журнал (