在标准输出上显示 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 日志而不更改源代码的主要内容,如果未能解决你的问题,请参考以下文章

logging模块

python日志设置[logging]

logging模块

模块 logging random

Python + logging输出到屏幕,将log日志写入到文件

模块下篇————包和模块