Python中输出到Std.out的日志未按格式显示问题
解决Python日志控制台输出格式不匹配的问题
嘿,我刚好碰到过这个问题!你的代码里控制台日志格式不对的原因很明确:你手动添加的StreamHandler没有继承basicConfig里设置的格式规则。
问题根源拆解
当你调用logging.basicConfig(filename="logname", ...)时,它会为根日志器自动创建一个FileHandler,并且给这个handler绑定了你定义的格式和日期格式。但之后你通过logging.getLogger().addHandler(logging.StreamHandler())添加的新控制台handler,它默认使用的是日志模块的默认格式(仅显示日志级别和消息内容),所以才会出现文件日志格式正常、控制台日志格式混乱的情况。
修复方案:给StreamHandler手动设置格式
你只需要在创建StreamHandler的时候,给它指定和文件日志完全一致的Formatter就行,修改后的代码如下:
import logging # 先统一定义格式规则,方便复用 log_formatter = '%(asctime)s,%(msecs)03d %(name)s %(levelname)s %(message)s' date_formatter = '%D %H:%M:%S' # 配置文件日志的基础设置 logging.basicConfig( filename="logname", filemode='a', format=log_formatter, datefmt=date_formatter, level=logging.DEBUG ) # 获取根日志器实例 root_logger = logging.getLogger() # 创建控制台handler并绑定格式 stream_handler = logging.StreamHandler() formatter = logging.Formatter(log_formatter, datefmt=date_formatter) stream_handler.setFormatter(formatter) # 将控制台handler添加到根日志器 root_logger.addHandler(stream_handler) # 测试日志输出 logging.info("=================================================") logging.info("starting execution")
为什么这样管用?
日志模块里的每个Handler(不管是文件还是控制台)都有自己独立的Formatter配置。basicConfig只会给它自动创建的那个Handler(这里是FileHandler)应用你定义的格式,而你后来手动添加的StreamHandler必须单独配置格式,才能和文件日志保持一致的输出风格。
内容的提问来源于stack exchange,提问作者user8042669
相关产品推荐
相关产品推荐

