我想在 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/