【发布时间】:2016-02-20 08:55:39
【问题描述】:
我有一个使用 python 日志记录的应用程序。所有 INFO 消息都会打印到控制台,并且 DEBUG 会保存到文件中。我使用了一个在 INFO 级别上过于冗长的库,但我仍然希望在我的日志 file 中包含这些消息。如何拦截来自库的日志消息并将其级别从 INFO 更改为 DEBUG?
【问题讨论】:
我有一个使用 python 日志记录的应用程序。所有 INFO 消息都会打印到控制台,并且 DEBUG 会保存到文件中。我使用了一个在 INFO 级别上过于冗长的库,但我仍然希望在我的日志 file 中包含这些消息。如何拦截来自库的日志消息并将其级别从 INFO 更改为 DEBUG?
【问题讨论】:
this 帖子中的类似内容?
import sys f = open('c:\\goat.txt', 'w') sys.stdout = f print "test"
这会将 ALL 打印语句重定向到文本文件。您可以使用以下方式改回:
sys.stdout = sys.__stdout__
【讨论】:
如果该库是您编写的库(我怀疑不是这种情况),您可以使用 python 自己的日志记录系统调整日志记录级别:
https://docs.python.org/3/library/logging.html#logging-levels
但是,必须处理大量疯狂的日志来调试某些问题更为常见(而不是特定于 python 语言)。通常您没有编写代码或没有时间更改工作库。日志中总是堆满您不立即感兴趣的内容。因此,这里有一个解决方法,只查看您感兴趣的内容。我发现减少混乱的一个好方法是过滤 tail 命令的输出:
tail -F ./my_apps.log | grep -iHn "错误"
tail 命令显示日志的最后一部分(尾部)。 -F 选项告诉它积极地尝试跟踪日志(即使它被删除并重新创建)。管道“|”连接两个命令。
grep 命令使用强大的正则表达式(现在就学习它们!)来查找模式。它不一定是“错误”,它可以是任何模式和/或通配符和类别。
如果您正在开发视频游戏 AI,例如,您可能有两个终端跟踪相同的日志:
tail -F ./my_game.log | grep -iHn "monster1" 和 尾-F ./my_game.log | grep -iHn "人类"
并查看每个对象在做什么(只要代码在两个对象前面加上正确的字符串记录调用)。您希望将日志写入同一个文件,以便调试操作顺序问题。
tail 和 grep 是 unix 工具,但它们有 Windows 端口(我认为是 GnuWin32)。
您还可以过滤控制台/终端输出:
python myapp.py | grep -iHn "some_pattern"
【讨论】: