python - 如何在 ipython session 中完全重置 Python stdlib 日志记录模块?

标签 python logging ipython

我想在 ipython session 中使用 %run 重复调用 Python 脚本,并根据通过 %run 传递的 cmdline 参数对每个脚本进行记录。

例如,在调试 cmd.py 时我可能会随着时间的推移想要运行:

%run cmd.py
... logs with default behavior, e.g. to STDERR with root level WARN

%run cmd.py --log_level DEBUG --log_file /tmp/cmd.out
... logs with root level DEBUG to a file

%run cmd.py --log_level ERROR

不幸的是,这很困难,因为由 logging.basicConfig 创建的日志记录状态在第一个 %run 命令后仍然存在(对于所有模块来说更普遍,并且在使用 %run 时通常是可取的)。

我意识到,在完全普遍的情况下,像上面这样的一系列 %run 命令与在新进程中运行每个命令是不同的。但是,如果log_level和log_file之类的东西可以重新初始化,那将是非常方便的。

我在 cmd.py 中试过这样的东西:

import logging_config  # parse logging config from sys.argv
reload(logging_config) # re-parse cmdline if using %run multiple times

和 logging_config.py 做(浓缩):

if logging_initialized:
    logging.getLogger().setLevel(lvl)
else:
    logging.basicConfig(level=lvl)
    logging_initialized = True

它适用于简单的情况,但如果 cmd.py 导入也使用日志记录的库则无效。我也尝试过 logging.shutdown()(在每个 cmd.py 结束时调用),但这似乎没有帮助。

最佳答案

不要将 basicConfig() 用于这种用法 - 它用于简单的一次性配置,并且如文档所述,第一次调用后的后续调用无效(它只如果根记录器没有处理程序,则任何内容)。如果您的脚本是从 shell 提示符运行,而不是从交互式解释器、IPython、IDLE、PythonWin 或您正在与之交互的进程不会退出的其他类似环境运行,这会很好。

相反,使用编程配置,或 fileConfig()dictConfig() - 这些模式可以用新的配置完全替换现有的日志配置。

关于python - 如何在 ipython session 中完全重置 Python stdlib 日志记录模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5691130/

相关文章:

python - IPython - 循环输入历史记录中的 block ?

python - 将多个正则表达式合并为一个可能为 "catch them all"

python - 在 VSC 中,如何在 Python 中重命名模块时激活 "refactor preview"?

logging - 在 Lighttpd 中按日期或文件大小拆分日志文件

vb.net - NLog - 在运行时设置记录器级别?

python - PyQT5 - 警告使用 'exit' 、 'quit' 或 Ctrl-D 退出 jupyter notebook 中的应用程序

matplotlib - 在客户端机器上制作 ipython notebook %matplotlib qt 弹出图

python - ubuntu 12.04 上的 CUDA 安装

python - 我正在使用 Hadoop 与 python 进行数据处理,应该使用什么文件格式?

java - "Lambda can be replaced with method reference"in Lazy Logging with Log4J2