python logging一场 disabled引发的血案
以fastapi为例,启动用的uvicorn.run()
当用户配置了自己日志之后,框架自带的日志就无输出了
这篇文章以两个部分说明原理
第一部分: 伪代码复现场景
第二部分: uvicorn
源码
- 第一部分: 以下方代码为例复现场景
- code
import logging import logging.config logging.basicConfig( level=logging.DEBUG, format="basicConfig:test >> %(asctime)s %(filename)s:%(lineno)d [%(levelname)s] %(message)s" ) test_logger = logging.getLogger("demo") def init_logger(): config = { "version": 1, "formatters": { "simple": { "format": "init_logger>> %(asctime)s %(filename)s:%(lineno)d [%(levelname)s] [%(funcName)s] %(message)s" } }, "handlers": { "console": { "class": "logging.StreamHandler", "formatter": "simple", "level": "DEBUG", "stream": "ext://sys.stdout" }, "run": { "backupCount": 5, "class": "logging.handlers.RotatingFileHandler", "encoding": "utf-8", "filename": "./run.log", "formatter": "simple", "level": "DEBUG", "maxBytes": 104857600 }}, "loggers": { "run": { "handlers": [ "console", "run" ], "level": "INFO", "propagate": False } }, "root": { "handlers": [ "console" ], "level": "DEBUG" } } logging.config.dictConfig(config) return logging.getLogger('run') test_logger.info("test_logger start") logger = init_logger() logger.info("用户初始化的日志") # test_logger.disabled = False test_logger.info("test_logger end")
- 输出
如上 以上test_logger end
无输出, 在放开test_logger.disabled = False
这行注释后,可以正常输出如下
日志的disabled
属性意义在于显示地将隐藏的日志句柄打开
,具体的实现原理可以翻看源码。
另外注意一点: 在解开注释之后test_logger.info("test_logger end")
这行的输出并没有用test_logger.info("test_logger start")
一样的格式,因为用户init_logger
配置的formatters
覆盖了之前的格式,这个是正常的。
- code