启用logging文件日志后asyncio协程未捕获异常无屏幕输出的原因与解决
根本原因
- Python的
logging.config.fileConfig方法默认参数disable_existing_loggers=True,调用时会禁用所有未在配置文件[loggers]段显式声明的已存在logger asyncio模块在导入时就会创建名为asyncio的专属logger,未捕获的协程任务异常默认通过这个logger输出错误日志- 你的配置文件仅声明了root logger,调用fileConfig后
asynciologger被禁用,因此异常日志不会输出,既不会打印到屏幕,也不会写入日志文件
解决方案
两种方案均满足不修改业务逻辑、不禁用文件日志、不额外加try...except的要求:
方案1:修改fileConfig调用参数
调整logging配置行的参数,关闭自动禁用已有logger的逻辑:
logging.config.fileConfig("logger.conf", defaults=dict(log_file="run.log"), disable_existing_loggers=False)
修改后asyncio logger会正常工作,未捕获异常会按你配置的root logger规则,同时输出到屏幕和写入日志文件。
方案2:在配置文件中显式声明asyncio logger
修改logger.conf的[loggers]段,新增asyncio logger声明:
[loggers] keys=root,asyncio
再新增asyncio logger的配置段即可:
[logger_asyncio] level=DEBUG handlers=handlerScreen,handlerFile qualname=asyncio propagate=0
显式配置后asyncio logger不会被禁用,异常日志会按指定规则输出。
内容的提问来源于stack exchange,提问作者atline
相关产品推荐
相关产品推荐

