【问题标题】:Save console output in txt file as it happens将控制台输出保存在 txt 文件中
【发布时间】:2023-02-01 13:44:20
【问题描述】:

我想要将我的控制台输出保存在文本文件中,但我希望它是当它发生的时候这样,如果程序崩溃,将保存日志。 你有什么想法吗?

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

【问题讨论】:

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

标签: python output-buffering


【解决方案1】:

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

作为一个例子,你可以使用这样的东西,它同时记录到终端和文件:

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 &

【讨论】:

  • 这也是最佳实践
  • 不过,&amp; &gt; 语法不是标准的 POSIX sh;如果你把它放在 cron 工作中,你想要 nohup python main.py &gt;log_file.out 2&gt;&amp;1,例如,在 Bashisms 不可用的地方。 (此外,在&amp;&gt; 之间放置一个空格很奇怪)
【解决方案2】:

实际上有很多方法可以做到这一点。然而,由于不同的原因(可维护性、易用性、重新发明轮子等),它们并不都适用。

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

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

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

如果您想从 Python 端进行操作,您可以:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2021-06-20
    • 2014-06-06
    相关资源
    最近更新 更多