Python Logging多Handler不生效:如何实现分级日志输出到不同目标?
Python logging多日志处理器分级输出失效问题
预期配置规则
- 本地日志文件:记录INFO级别及以上日志
- 控制台输出:记录DEBUG级别及以上日志
- 远程Socket日志源:记录INFO级别及以上日志
- 最终目标:
sessionLog.debug()触发的日志仅输出到控制台,不写入本地文件、不发送到远程日志源
现有代码的核心配置偏差
按照Python logging的过滤链路规则:日志事件会先经过当前日志实例本身的级别阈值校验,通过后才会分发给所有挂载的处理器,每个处理器再基于自身的级别阈值做二次过滤。现有代码的配置存在四个明确的偏差:
- 本地文件处理器的级别被设置为
logging.DEBUG,导致DEBUG级日志不会被本地文件过滤,和控制台收到的日志完全同步 - 根日志实例的级别被设置为
logging.INFO,DEBUG级日志在到达控制台处理器之前就被根日志拦截,无法实现控制台单独输出DEBUG日志的效果 - 远程Socket处理器的初始化参数错位:将host参数位置传入了端口值,导致远程日志一直无法正常工作
- 代码缺失必要导入:
datetime模块、sys.stdout未导入,存在运行报错风险
修正后可直接运行的配置代码
import logging import logging.handlers import datetime from sys import stdout # 生成本地日志文件名 sessionLogFilename = datetime.datetime.now().strftime('LineGame_%H_%M_%d_%m_%Y.log') # 定义不同场景的日志格式 logFormatFiles = "ROBITLOG: " + '%(asctime)s - %(name)s - %(message)s' logFormatConsole = "ROBITLOG: " + '%(asctime)s - %(name)s - %(levelname)s - %(message)s' filelogformatter = logging.Formatter(logFormatFiles) consolelogformatter = logging.Formatter(logFormatConsole) # 配置本地文件处理器:仅保留INFO及以上日志 fileLogger = logging.FileHandler(sessionLogFilename) fileLogger.setLevel(logging.INFO) fileLogger.setFormatter(filelogformatter) # 配置控制台处理器:保留DEBUG及以上日志 consoleLogger = logging.StreamHandler(stdout) consoleLogger.setLevel(logging.DEBUG) consoleLogger.setFormatter(consolelogformatter) # 配置远程Socket处理器:仅保留INFO及以上日志 remoteLoggerIP = "127.0.0.1" remoteLoggerPort = 5124 remoteLogger = logging.handlers.SocketHandler(remoteLoggerIP, remoteLoggerPort) remoteLogger.setLevel(logging.INFO) # 获取根日志实例,设置全局最低过滤阈值 sessionLog = logging.getLogger('') sessionLog.setLevel(logging.DEBUG) # 挂载所有配置好的处理器 sessionLog.addHandler(fileLogger) sessionLog.addHandler(consoleLogger) sessionLog.addHandler(remoteLogger)
配置生效后的效果验证
- 调用
sessionLog.debug("测试debug日志")时:日志仅输出到控制台,不会写入本地文件、不会发送到远程日志源 - 调用
sessionLog.info("测试info日志")时:日志会同时输出到控制台、写入本地文件、发送到远程日志源
内容的提问来源于stack exchange,提问作者mlw4428
相关产品推荐
相关产品推荐

