Ubuntu下Python logging无法为stdout与文件设置不同日志级别求助
问题描述
我在Ubuntu环境中无法为日志记录器的标准输出(stdout)和文件设置不同的日志级别,但在Windows环境(搭配Anaconda的Spyder)中该功能可正常工作。以下是我的示例代码:
import logging #from logging.handlers import RotatingFileHandler logfile = "log.log" levels =('NOTSET', 'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL') dateformat = '%y-%m-%d %H:%M:%S' strformat = '%(asctime)s %(levelname)s in %(funcName)s at %(lineno)s: %(message)s' formatter = logging.Formatter(strformat,datefmt=dateformat) for handler in logging.root.handlers[:]: logging.root.removeHandler(handler) logging.basicConfig( format = strformat, datefmt = dateformat, force = True, level = logging.WARNING, ) if logfile: print(f"Creating {logfile}") fh = logging.FileHandler(logfile) #fh = RotatingFileHandler(logfile, maxBytes=(1000), backupCount=1) fh.setLevel(logging.DEBUG) fh.setFormatter(formatter) logging.getLogger('').addHandler(fh) logging.debug(f"logging level is set to {levels[logging.root.level//10]}") logging.warning("level warning test")
我原本期望文件中能显示DEBUG级别的消息,但实际并未出现;WARNING级别的消息在标准输出和文件中均能正常显示。请问我哪里操作有误?另外,是否需要提供logging模块的版本?该如何查看?
问题分析与解决
核心问题
你给根日志记录器设置的级别是logging.WARNING,而日志记录器的级别会优先过滤掉低于该级别的日志,不管你给handler设置什么级别。也就是说,根记录器会直接把DEBUG级别的日志拦截下来,根本不会传递给文件handler,所以文件里看不到DEBUG内容。
修复方案
把根日志记录器的级别调整为logging.DEBUG,然后单独给标准输出的handler设置logging.WARNING级别,确保不同handler使用不同的过滤规则:
import logging logfile = "log.log" levels =('NOTSET', 'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL') dateformat = '%y-%m-%d %H:%M:%S' strformat = '%(asctime)s %(levelname)s in %(funcName)s at %(lineno)s: %(message)s' formatter = logging.Formatter(strformat,datefmt=dateformat) # 清空原有handler for handler in logging.root.handlers[:]: logging.root.removeHandler(handler) # 根记录器设为DEBUG,确保所有级别日志都能进入处理流程 logging.basicConfig( format = strformat, datefmt = dateformat, force = True, level = logging.DEBUG, ) # 获取basicConfig自动创建的标准输出handler,设置其级别为WARNING stdout_handler = logging.root.handlers[0] stdout_handler.setLevel(logging.WARNING) if logfile: print(f"Creating {logfile}") fh = logging.FileHandler(logfile) fh.setLevel(logging.DEBUG) fh.setFormatter(formatter) logging.getLogger('').addHandler(fh) logging.debug(f"logging level is set to {levels[logging.root.level//10]}") logging.warning("level warning test")
调整后效果:
- 根记录器接收所有DEBUG及以上级别的日志
- 标准输出仅展示WARNING及以上的日志
- 文件会记录DEBUG及以上的日志,完全符合你的预期
关于logging版本
通常不需要特意提供版本,Python自带的logging模块核心逻辑在各版本中保持一致。如果需要查看版本,执行以下代码:
import logging print(logging.__version__)
或者直接在终端运行:
python -c "import logging; print(logging.__version__)"
内容的提问来源于stack exchange,提问作者Stefatronik
相关产品推荐
相关产品推荐

