将控制台输出保存在 txt 文件中

Save console output in txt file as it happens

提问人:LCMa 提问时间:11/17/2022 最后编辑:tripleeeLCMa 更新时间:2/1/2023 访问量:749

问:

我想将我的控制台输出保存在文本文件中,但我希望它保持原样,以便在程序崩溃时保存日志。 你有什么想法吗?

我不能只指定,因为我有很多不同的记录器正在打印到控制台中。filelogger

Python 输出缓冲

评论

2赞 Jay 11/17/2022
你可以像这样运行你的 python 程序python foo.py 2>&1 | tee -a logfile.log
0赞 LCMa 11/17/2022
@Jay 无法使其在 pycharm 中工作,但我找到了一个允许保存控制台的选项,但我想将其直接放在我的 python 代码中(我只想在我的 API 的一个端点调用中保存控制台)
0赞 cadvena 11/23/2022
似乎更有可能使用标准的 python 日志记录,而不是将控制台输出重定向到文本文件。这通常是首选,因为您可以根据是在生产模式还是调试模式下运行,将各种消息的日志记录级别设置为更详细或更简洁。有关日志记录,请参阅此处的 python 文档:docs.python.org/3/library/logging.html

答:

5赞 Ziur Olpa 11/21/2022 #1

我认为您确实可以使用记录器,只需添加一个文件处理程序,即可从日志记录模块中读取内容

例如,您可以使用如下内容,它同时记录到终端和文件中:

import logging
from pathlib import Path

root_path = <YOUR PATH>

log_level = logging.DEBUG

# Print to the terminal
logging.root.setLevel(log_level)
formatter = logging.Formatter("%(asctime)s | %(levelname)s | %(message)s", "%Y-%m-%d %H:%M:%S")
stream = logging.StreamHandler()
stream.setLevel(log_level)
stream.setFormatter(formatter)
log = logging.getLogger("pythonConfig")
if not log.hasHandlers():
    log.setLevel(log_level)
    log.addHandler(stream)

# file handler:
file_handler = logging.FileHandler(Path(root_path / "process.log"), mode="w")
file_handler.setLevel(log_level)
file_handler.setFormatter(formatter)
log.addHandler(file_handler)

log.info("test")

如果您有多个记录器,您仍然可以使用此解决方案,因为记录器可以从其他记录器继承,只需将处理程序放在根记录器中并确保其他人从该记录器中获取处理程序即可。

作为替代方案,您可以使用 nohup 命令,即使终端关闭,它也会保持进程运行,并将输出返回到所需位置:

nohup python main.py > log_file.out &

评论

0赞 Raqun Bob 11/28/2022
这也是最佳做法
0赞 tripleee 2/1/2023
不过,语法不是标准的 POSIX;如果你把它放在一个工作中,例如,在没有 Bashisms 的地方,你想要。(另外,在和之间放一个空格很奇怪& >shnohup python main.py >log_file.out 2>&1cron&>)
0赞 Ziur Olpa 2/1/2023
@tripleee,谢谢,“&>”是我刚刚编辑的错别字。&最后的要点只是为了允许用户继续使用终端,并不是真正需要的
4赞 Jib 11/21/2022 #2

从字面上看,有很多方法可以做到这一点。但是,由于不同的原因(可维护性、易用性、重新发明轮子等),它们并不都适合。

如果您不介意使用操作系统内置,您可以:

  • 使用 将标准输出和错误流转发到您选择的文件。python3 -u ./myscript.py 2>&1 outputfile.txt

  • 将标准输出和错误流转发到您选择的文件,并使用 将其显示到控制台。该选项指定输出是无缓冲的(即:放入管道中的东西立即输出)。python3 -u ./myscript.py 2>&1 tee outputfile.txt-u

如果你想从 Python 端执行此操作,你可以:

  • 使用该模块将生成的日志输出到文件句柄,而不是标准输出。logging

  • 覆盖 sys( 和 ) 中定义的 stdout 和 stderr 流,以便它们指向您选择的打开的文件句柄。例如。sys.stdoutsys.stderrsys.stdout = open("log-stdout.txt", "w")

作为个人偏好,越简单越好。该模块是为日志记录而制作的,并提供了实现您想要的所有必要机制。所以。。我建议你坚持下去。这是模块文档的链接,其中还提供了许多示例,从简单使用到更复杂和高级的使用。logginglogging