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
相关产品推荐
相关产品推荐

