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

Python标准输出重定向问题:logging模块输出未写入文件

嘿,这个问题我之前踩过坑,咱们来一步步搞明白:

为什么logging日志没被重定向到文件?

核心原因很简单:Python的logging模块默认是输出到stderr(标准错误流),而不是stdout(标准输出流)!

你用命令python verifyPhone.py -f dupl.csv 1> deleted.txt的时候,1>只重定向了stdout,stderr还是会直接输出到终端。而print()函数默认是往stdout写的,所以它的内容能顺利进文件,logging的日志却还在屏幕上。

怎么让logging日志跟着重定向到文件?

有两种常用方案:

方案1:在代码里把logging的输出流改成stdout

直接在脚本里配置logger的时候,指定输出到sys.stdout:

import logging
import sys

# 获取根logger
logger = logging.getLogger()
logger.setLevel(logging.INFO)

# 创建一个输出到stdout的handler
stdout_handler = logging.StreamHandler(sys.stdout)
# 可选:添加日志格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
stdout_handler.setFormatter(formatter)

# 把handler添加到logger
logger.addHandler(stdout_handler)

改完之后再运行原来的重定向命令,logging的日志就会和print内容一起写入deleted.txt了。

方案2:命令行同时重定向stderr到stdout

不想改代码的话,直接在命令行把stderr也定向到stdout的目标文件:

python verifyPhone.py -f dupl.csv > deleted.txt 2>&1

这里2>&1的意思是:把文件描述符2(也就是stderr)的输出,重定向到文件描述符1(stdout)当前指向的位置(也就是deleted.txt)。这样不管是logging的stderr输出,还是print的stdout输出,都会进文件。

已经重定向后,怎么在终端还能看到输出?

如果想同时把输出写入文件,又在终端实时查看,可以用tee命令:

python verifyPhone.py -f dupl.csv 2>&1 | tee deleted.txt

tee会把接收到的内容同时输出到终端和指定文件,完美解决“既要存文件又要实时看”的需求。

如果只是想让logging的日志留在终端,只把print的内容写入文件,那保持你原来的命令就行——因为logging默认输出到stderr,本来就会显示在终端,只有stdout被重定向到文件了。

内容的提问来源于stack exchange,提问作者Krrish Raj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:18:05