#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. у меня происходит журнал (