【问题标题】:Using stdout to customize Logfile使用 stdout 自定义 Logfile
【发布时间】:2012-05-19 05:54:27
【问题描述】:

对于我当前的项目,我需要找到一种方法将依赖于标准输出的版本或至少一个格式化的标准输出写入日志文件。 目前我只是在使用 subprocess.Popen(exec, stdout=log),它将它写入一个未格式化的文件。

我的最佳想法是即时格式化输出,方法是截取标准输出,将其重新路由到自定义模块,并使用 if 和 elif 的组合将自己的字符串写入日志。但是我在文档中找不到任何关于如何在 Python 3 中执行此操作的方法。我能找到的最合适的答案是在this question,接受的答案已经很接近了。

但我只是不明白我应该如何构建应该用作 stdout=class 的类。这些方法中的哪一种接收输入(以及它是如何格式化的)?这些方法中哪些是必要的?或者甚至可能有一种更简单的方法来完成我想做的事情?

【问题讨论】:

  • 您是否考虑过使用日志记录模块?您将 sys.stdout 设置为您想要的任何文件描述符,而不产生子进程。 sys.stdout = open('somefile', 'a')
  • 嗯,日志记录模块不适合我的项目,因为它基本上只是一个调用预编译可执行文件的脚本,这就是我想要更改/格式化标准输出的原因。将可执行文件作为子进程打开对我来说更可靠,并且标准输出当前已经进入文件(日志),但是 - 如前所述 - 未格式化。

标签: python logging python-3.x stdout logfiles


【解决方案1】:

您可以使用sarge 项目来允许父进程捕获子进程的stdout(和/或stderr),逐行读取(比如说),然后随心所欲地读取行(包括将它们以适当的格式写入日志文件)。

披露:我是sarge 项目的维护者。

【讨论】:

  • 这正是我所需要的,谢谢!但令我印象深刻的是有限的交叉兼容性和 sarge 的大小,因为我的脚本只有 200 行长和一个文件。所以我想最好编写我自己的 Capture 类,尽可能轻量级。我将尝试从您的来源中学习一些知识,并了解如何准确处理输出以实现类似的效果。如果这确实有效,我将在标题中花费您和您的项目一行。 :)
猜你喜欢
  • 2018-01-20
  • 2023-03-29
  • 2013-07-20
  • 2015-07-17
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
相关资源
最近更新 更多