实时输出重定向

2 投票
1 回答
3237 浏览
提问于 2025-04-18 12:25

目前我正在用以下命令把一个脚本的输出重定向到一个日志文件:

python /usr/home/scripts/myscript.py 2>&1 | tee /usr/home/logs/mylogfile.log

这个方法看起来有效,但它并不是每次有打印命令就立即写入文件,而是等到有一组行可以一起打印时才写入。我希望控制台和日志文件能够同时写入。请问怎么才能通过输出重定向实现这个呢?需要注意的是,在控制台运行脚本时,输出是正常的。不过用 tail -f 命令查看日志文件时就不太顺畅,因为它一次性写入大约50行。有什么建议吗?

1 个回答

1

听起来是你的 shell 在进行缓冲,因为你提到在没有使用 tee 的情况下,输出到控制台是正常的。

你可以看看这个帖子,里面有一些可能的解决方案,可以帮助你关闭这个 shell 缓冲: https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe

不过我建议你完全在 Python 中处理,这样你可以更直接地控制。与其打印到 stdout,不如使用 logging 模块。

这样做可以让你在记录日志时有更多的灵活性,比如可以设置多个日志级别,还可以将多个来源集中到一个日志对象中(比如 stdout 和一个文件,如果你想的话,还可以设置文件大小达到一定程度后自动轮换,使用 logging.handlers.RotatingFileHandler)。这样你就不需要受限于 shell 的外部缓冲了。

更多信息请查看: https://docs.python.org/2/howto/logging.html

撰写回答