我正在使用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]
This question提到在处理程序配置中使用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)
我做错了什么?
答案 0 :(得分:2)
调用处理程序对象的doRollover()
将重置文件处理程序以在每次运行之前覆盖旧文件。
答案 1 :(得分:0)
我最初将logging.handlers.RotatingFileHandler
用作记录器配置的原始处理程序类。我这样做是因为我试图将非常小的磁盘上的内存风险降至最低。但是,使用logging.handlers.RotatingFileHandler
代替logging.FileHandler
似乎会禁用YAML配置文件中的mode: 'w'
选项。 linked question中的提问者似乎暗示他认为这可能是问题所在,但发布的答案并未反映出这一点(因此感到困惑)。
使用logging.FileHandler
解决了我的问题,允许每次执行都覆盖我的日志文件。我了解改写日志和轮换日志的目的相互之间有一定的冲突,但是我认为,轮转日志所提供的安全性以及所希望的改写日志的便利性将是我的项目的最佳选择。