You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 11:16:31