如何创建新StreamHandler且不丢失日志输出行中的模块名?
解决日志StreamHandler替换后丢失模块名的问题
问题出在你新建的StreamHandler没有配置日志格式——logging.basicConfig自动给默认Handler设置了包含日志级别、模块名的格式,所以之前能看到INFO:__main__:hello;而你手动创建的StreamHandler默认只输出消息内容,所以只会显示hello。
要保留模块名,只需要给新的StreamHandler指定格式即可,用logging.Formatter定义包含%(name)s(模块名占位符)的格式字符串就行,比如默认的格式'%(levelname)s:%(name)s:%(message)s'。
修改后的代码如下:
import logging logging.basicConfig(level=logging.INFO) LOG = logging.getLogger(__name__) # 移除根日志器的旧Handler for handler in logging.getLogger().handlers: logging.getLogger().removeHandler(handler) # 创建新的StreamHandler并设置格式 new_handler = logging.StreamHandler() new_handler.setFormatter(logging.Formatter('%(levelname)s:%(name)s:%(message)s')) logging.getLogger().addHandler(new_handler) # 现在输出会显示:INFO:__main__:hello LOG.info('hello')
如果需要自定义其他格式,也可以调整Formatter的字符串,比如加上时间'%(asctime)s - %(levelname)s - %(name)s - %(message)s',按需修改即可。
内容的提问来源于stack exchange,提问作者personal_cloud
相关产品推荐
相关产品推荐

