在标准输出上显示 INFO 级别的 python 日志而不更改源代码
Posted
技术标签:
【中文标题】在标准输出上显示 INFO 级别的 python 日志而不更改源代码【英文标题】:Showing INFO-level python logs on stdout without changing source code 【发布时间】:2020-10-16 21:23:49 【问题描述】:如果我无法更改其源代码的模块显示如下内容:
# foo.py
import logging
logging.info('Hello world')
如何在运行时查看日志
$ python foo.py
来自我的 POSIX 兼容终端?
AlltheanswersIcanfind这涉及到更改源代码。
The docs 非常清楚记录 WARN 级别及以上:
INFO 消息未出现,因为默认级别为 WARNING。
但我无法轻易看出如何更改该默认设置。
【问题讨论】:
这应该是一个脚本,还是一个可导入的模块?如果它是一个模块,只需在您自己的代码中配置日志记录。如果它是一个脚本,那么脚本的工作就是提供配置日志记录的选项。 (如果它是一个没有选项来配置日志记录的脚本,那么很可能这些日志根本就不会显示给用户 - 也许它们是一个调试的东西,或从具有可配置日志记录的程序中复制粘贴的不必要代码。) 另外,你真的是指标准输出吗?登录到标准流时,通常的选择是 stderr。 是的,我应该说“屏幕”。我不在乎标准输出和标准错误。 【参考方案1】:使用为您预先配置 logging
的咒语运行脚本(现在与 Python3 的兼容性提高了 100%)。
$ cat foo.py
import logging
logging.info('Hello world')
$ python3 -c 'import logging,sys,runpy;logging.basicConfig(level=logging.INFO,stream=sys.stdout);runpy.run_path("foo.py")'
INFO:root:Hello world
~/Desktop
还不够难忘?
为了更令人难忘,您可以将内容包装在 please_log.py
中。一些sys.argv
是必需的。
please_log.py
>import logging, sys, runpy
script = sys.argv.pop(1)
logging.basicConfig(level=logging.INFO, stream=sys.stdout)
runpy.run_path(script)
foo.py
>import logging
import sys
logging.info('Hello world: %s', sys.argv)
输出
$ python3 please_log.py foo.py
INFO:root:Hello world: ['foo.py']
【讨论】:
如果这是我们能做的最好的,我会很难过的。不太难忘! 添加了一个包装脚本选项。execfile
在 Python 3 中不存在。
@user2357112supportsMonica 哎呀,好点子。固定:)
确实似乎logging
没有比这更好的了。我有点期望有一个OVERRIDE_LOG_LEVEL=INFO python ...
envvar 解决方案。呃,好吧。我生活和学习。以上是关于在标准输出上显示 INFO 级别的 python 日志而不更改源代码的主要内容,如果未能解决你的问题,请参考以下文章