Python logging日志既不打印控制台也不写入日志文件问题求助
问题诊断
你的日志完全不输出的核心错误是未给自定义Logger实例设置日志过滤级别。
Python logging 模块的日志处理是分层过滤的:
- 第一层过滤在Logger实例本身:日志消息产生后,首先会和Logger自身的级别对比,低于该级别的消息会被直接丢弃,不会传递给任何绑定的处理器
- 第二层过滤在各个绑定的Handler:只有通过Logger层校验的消息,才会流转到Handler,Handler再根据自身配置的级别决定是否输出到对应位置
你的代码存在3个直接导致日志失效的问题:
- 创建
MyLogger实例后没有调用setLevel()设置级别,自定义Logger的默认级别是logging.WARNING,所有INFO、DEBUG级别的日志在入口就被拦截,根本到不了控制台和文件处理器 - 文件处理器
fh没有显式设置日志级别,默认级别为NOTSET,继承上层配置后实际生效级别也是WARNING,就算Logger放行了INFO日志,文件处理器也不会写入 - 用
if not bool(logger.handlers)判断是否重复添加Handler的逻辑不可靠:如果其他代码提前给同名Logger绑定过处理器,这段逻辑会直接跳过所有配置,导致日志输出行为不符合预期。
修复代码
直接修改helper.py中的get_logger函数即可,修改后完整代码如下:
import logging import os from json import load def get_config(value): with open('config.json','r') as f: result=load(f)[value] return result def get_logger(name,level): logpath=get_config("log_path") if not os.path.exists(logpath): os.mkdir(logpath) logger = logging.getLogger(name) # 给Logger设置全局级别,放行对应等级的日志进入处理流 logger.setLevel(level) # 清空已有处理器,避免重复添加导致日志重复打印 logger.handlers.clear() formatter = logging.Formatter( '%(asctime)s.%(msecs)03d - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) # 配置文件处理器 fh = logging.FileHandler( os.path.join(logpath, f'{get_config("log_file_name")}.log'), mode="w", encoding='utf-8' ) fh.setFormatter(formatter) fh.setLevel(level) # 给文件处理器设置级别 logger.addHandler(fh) # 配置控制台处理器 ch = logging.StreamHandler() ch.setFormatter(formatter) ch.setLevel(level) logger.addHandler(ch) return logger LOGGER=get_logger("MyLogger", logging.INFO)
补充说明
你之前用basicConfig()时出现print()输出和日志顺序错乱的问题,是因为logging的流处理器默认带输出缓冲,和print的行缓冲机制不一致导致的,修好上述级别问题后直接用自定义Handler的方案即可,不需要回退到basicConfig()。
内容的提问来源于stack exchange,提问作者Super Ultra Noob
相关产品推荐
相关产品推荐

