【发布时间】:2020-01-03 07:29:09
【问题描述】:
我想捕获 python 程序打印的日志,并将其保存到变量或文件中。有没有办法在不添加处理程序或修改记录器配置的情况下实现这一点? (这是因为 logger 类将被许多其他模块使用,我们希望它是通用的)
代码sn-p:
import logging
from io import StringIO
from contextlib import redirect_stdout
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s %(levelname)s %(message)s")
with StringIO() as buf, redirect_stdout(buf), open("test.txt", "w+") as f:
logger.debug("Debug message")
logger.info("Info message")
logger.error("Error message")
buf.flush()
f.write(buf.getvalue())
控制台输出:
xxxx-xx-xx xx:xx:xx,xxx DEBUG Debug message
xxxx-xx-xx xx:xx:xx,xxx INFO Info message
xxxx-xx-xx xx:xx:xx,xxx ERROR Error message
让我感到困惑的是,由于 logger 默认将所有日志打印到标准输出,使用上下文管理器重定向标准输出应该可以解决问题。但是,日志仍会打印到控制台,并且不会将任何内容写入文件。有什么想法吗?
【问题讨论】:
-
有条件地添加额外的处理程序对你来说是正确的方法,初始化时说,如果 os.environ["YourTeam_YourLogger_Debug"] == "ON" ,你附加另一个 rsys 日志处理程序。否则,您将不得不跟踪/嗅探文件更改,而这是最糟糕的。
标签: python-3.x logging io