Я использую модуль Python logging.config
для настройки и использования инструмента ведения журнала в моем проекте.
Я хочу, чтобы мои файлы журнала перезаписывались каждый раз (а не добавлялись), поэтому я установил свой файл конфигурации YAML следующим образом:
# logging configuration file
version: 1
disable_existing_loggers: False
formatters:
simple:
format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: simple
stream: ext://sys.stdout
info_file_handler:
class: logging.handlers.RotatingFileHandler
level: INFO
formatter: simple
filename: .logs/info.log
maxBytes: 10485760 # 10MB
backupCount: 20
encoding: utf8
mode: 'w'
error_file_handler:
class: logging.handlers.RotatingFileHandler
level: ERROR
formatter: simple
filename: .logs/errors.log
maxBytes: 10485760 # 10MB
backupCount: 20
encoding: utf8
mode: 'w'
loggers:
my_module:
level: ERROR
handlers: [console]
propagate: no
root:
level: INFO
handlers: [console, info_file_handler, error_file_handler]
Этот вопрос упоминает, что использование mode: w
в конфигурации обработчика должно выполнить то, что я хочу, но файлы журнала все равно продолжают добавляться. Вот и мой код конфигурации:
def logging_setup(cfg_path=definitions.LOG_CONFIG_PATH, def_lvl=logging.INFO):
"""Setup logging tool from YAML configuration file."""
# create directory for log files if not already there
try:
os.makedirs(definitions.LOGS_PATH)
except OSError as e:
if e.errno != errno.EEXIST:
raise
# configure logging from yaml config file
if os.path.exists(cfg_path):
with open(cfg_path, 'rt') as f:
config = yaml.load(f.read())
logging.config.dictConfig(config)
else:
logging.basicConfig(level=def_lvl)
Что я делаю не так?
Вот что вдохновило меня на добавление mode: w
. Однако это ничего не изменило.
Второй ответ, который показывает mode: 'w'
, вдохновил вас на добавление mode: w
?
Справедливо. Даже в этом случае добавление 'w'
не приводит к изменениям.
Я не думаю, что проблема в сравнении 'w'
и w
. Дело в том, что похоже, что вы не читали второй ответ, на который указали ссылку, хотя во втором ответе есть много других вещей, которые вполне могут быть вашим ответом. Я не хочу тратить много времени на чтение этого, просто чтобы провести вас через те же шаги, которые вы могли бы получить из существующего ответа, или чтобы попытаться выяснить, почему это не относится к вашему вопросу, когда вы знаю это лучше, чем я, и т. д.
Первоначально я использовал logging.handlers.RotatingFileHandler
в качестве исходного класса обработчика для моей конфигурации регистратора. Я сделал это, потому что стараюсь минимизировать возможные риски памяти на очень маленьком диске. Однако: использование logging.handlers.RotatingFileHandler
вместо logging.FileHandler
, похоже, отключает опцию mode: 'w'
в файле конфигурации YAML. Спрашивающий в связанный вопрос, кажется, предполагает, что он думает, что это может быть проблемой, но опубликованные ответы не отражают этого (отсюда и мое замешательство).
Использование logging.FileHandler
решает мою проблему, позволяя перезаписывать файлы журнала при каждом выполнении. Я понимаю, что перезапись журналов и ротация журналов служат целям, которые в некоторой степени конфликтуют друг с другом, но я подумал, что безопасность, которую предлагает ротация журналов с желаемым удобством перезаписываемых журналов, будет лучшим для моего проекта.
Вызов doRollover()
объекта-обработчика сбрасывает обработчик файлов для перезаписи старых файлов перед каждым запуском.
Вы читали второй ответ на этот вопрос?