【发布时间】:2021-05-05 16:02:03
【问题描述】:
我正在尝试在 Python 中使用日志记录模块,因此,当我运行我的程序时,我最终会得到一个日志文件 debug.log,其中包含:
- 每条日志消息(logging.DEBUG、logging.WARNING 等)
- 每次我的代码向 STDOUT 打印一些内容时
当我运行程序时,我只希望调试消息出现在日志文件中,而不是打印在终端上。
基于this answer,这是我的示例代码test.py:
import logging
import sys
root = logging.getLogger()
root.setLevel(logging.DEBUG)
fh = logging.FileHandler('debug.log')
fh.setLevel(logging.DEBUG)
sh = logging.StreamHandler(sys.stdout)
sh.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
sh.setFormatter(formatter)
fh.setFormatter(formatter)
root.addHandler(sh)
root.addHandler(fh)
x = 4
y = 5
logging.debug("X: %s", x)
logging.debug("Y: %s", y)
print("x is", x)
print("y is", y)
print("x * y =", x*y)
print("x^y =", x**y)
这就是我想要的 debug.log 的内容:
2021-02-01 12:10:48,263 - root - DEBUG - X: 4
2021-02-01 12:10:48,264 - root - DEBUG - Y: 5
x is 4
y is 5
x * y = 20
x^y = 1024
相反,debug.log 的内容只是前两行:
2021-02-01 12:10:48,263 - root - DEBUG - X: 4
2021-02-01 12:10:48,264 - root - DEBUG - Y: 5
当我运行test.py 时,我得到了这个输出:
2021-02-01 12:17:04,201 - root - DEBUG - X: 4
2021-02-01 12:17:04,201 - root - DEBUG - Y: 5
x is 4
y is 5
x * y = 20
x^y = 1024
所以我实际上得到了与我想要的相反的结果:日志文件排除了我希望包含它们的 STDOUT 打印,而程序输出包含了我希望排除它们的调试消息。
我该如何解决这个问题,以便运行test.py 只输出print 语句中的行,而生成的debug.log 文件包含调试日志和打印行?
【问题讨论】:
-
如果您真的想使用
print()并将所有stdout输出记录到文件中,也许this 可以提供帮助。但是,我只使用logging记录器而不是print(),它带有一个特殊的流处理程序,可以打印到stdout,而无需任何其他格式。 -
还有很多类似的问题,例如stackoverflow.com/q/19425736.
标签: python logging python-logging