【问题标题】:Capturing log information from bunch of python functions in single file从单个文件中的一堆 python 函数中捕获日志信息
【发布时间】:2013-01-18 16:42:49
【问题描述】:

我有 3 个脚本。一个是starttest.py,它会执行test.py 中调用的方法。方法在module.py中定义。

每个文件中有许多打印语句,我想从Starttest.py 文件本身捕获我的日志文件中的每个打印语句。我尝试在starttest.py 文件中使用sys.stdout,但这个函数只从starttest.py 文件中获取打印语句。它对test.pymodule.py 文件打印语句没有任何控制。

有什么建议可以只在一个地方从所有文件中捕获打印语句吗?

【问题讨论】:

  • 考虑使用logging module 而不是print 语句。
  • 日志模块能否帮助我捕获打印语句以及其他级别的调试信息?

标签: python python-2.7


【解决方案1】:

在从test.pymodule.py 导入任何内容之前,请将tye sys.stdout 文件对象替换为您喜欢的对象之一:

import sys

sys.stdout = open("test-output.txt", "wt")

# Import the rest

如果您在类 Unix 操作系统上运行,则有一种更安全的方法,不需要替换文件对象引用。特别是因为覆盖 sys.stdout 并不能保证先前的对象被销毁:

import os
import sys

fd = os.open("test-output.txt", os.O_WRONLY | os.O_CREAT, 0644)
os.dup2(fd, sys.stdout.fileno())
os.close(fd)

请注意,几乎所有 Python 的守护进程实现都使用了上述技巧。

即使没有直接关系,也请记住,您可以使用 shell 将命令输出重定向到文件(也适用于 Windows):

python starttest.py >test-output.txt

【讨论】:

  • 谢谢。这很有帮助!早些时候我也尝试过 sys.stdout 函数将日志保存到单个文件中,但它没有工作。现在它起作用了。我还在所有导入声明下方保留了 sys.stdout = open("test-output.txt", "wt") 并且它有效!惊讶
  • @user2033758:现在你的问题解决了,如果你勾选这个答案,它会确认回答者并将问题标记为关闭。
【解决方案2】:

也许看看python自带的日志模块

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多