使用YAML配置Python日志器仅生成空文件无输出的原因
日志无输出问题的诊断与解决
我来帮你排查这个日志无输出的问题,核心原因主要有两个,咱们一步步拆解解决:
1. 日志器名称不匹配是关键问题
你在logging.yaml里只配置了app.run这个日志器,但app/__init__.py中通过logger = logging.getLogger(__name__)获取的是名为app的日志器(因为__name__在包的__init__.py文件中对应的就是包名app)。这个未被显式配置的日志器会使用默认的日志设置,而默认设置并没有关联到你定义的那些文件Handler,所以你的日志根本不会被路由到aae.log文件中。
2. 多Handler写入同一文件的潜在隐患
你为每个日志级别单独创建了一个RotatingFileHandler,并且都指向aae.log,这种做法会导致日志写入混乱,甚至可能出现日志丢失的情况——多个Handler同时写入同一个文件很容易引发竞争条件。其实完全不需要这么做,一个Handler就可以处理所有级别的日志。
解决方案一:修正日志器配置(推荐)
修改logging.yaml,把日志器配置为app(覆盖整个app包下的所有模块),或者直接配置根日志器(用''表示),同时合并多个文件Handler为一个:
version: 1 disable_existing_loggers: False formatters: standard: format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s" handlers: console: class: logging.StreamHandler level: DEBUG formatter: standard stream: ext://sys.stdout unified_file_handler: class: logging.handlers.RotatingFileHandler level: DEBUG # 设置为最低级别,接收所有>=DEBUG的日志 formatter: standard filename: aae.log maxBytes: 10485760 # 10MB backupCount: 20 encoding: utf8 loggers: app: # 匹配app包下所有模块的日志器 level: DEBUG handlers: [console, unified_file_handler] propagate: no
这样修改后,app/__init__.py中用__name__获取的app日志器就会关联到你定义的文件Handler,日志就能正常写入aae.log了。
解决方案二:指定正确的日志器名称(临时方案)
如果你只想保留app.run的配置,那可以在app/__init__.py中显式获取app.run这个日志器:
logger = logging.getLogger('app.run') logger.info('Completed configuring logger()!')
不过这种方案不够灵活,只能覆盖单个日志器,不如方案一适合整个项目的日志管理。
验证步骤
- 保存修改后的配置文件和代码
- 重新运行
run.py - 检查
aae.log,你应该能看到Completed configuring logger()!这条INFO级别的日志,同时其他级别的日志也能正常写入。
内容的提问来源于stack exchange,提问作者ddd
相关产品推荐
相关产品推荐

