如何在ipython会话中完全重置Python stdlib日志记录模块?

Joe*_*ngs 6 python logging ipython

我想在ipython会话中使用%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
Run Code Online (Sandbox Code Playgroud)

不幸的是,这很困难,因为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
Run Code Online (Sandbox Code Playgroud)

和logging_config.py确实(浓缩):

if logging_initialized:
    logging.getLogger().setLevel(lvl)
else:
    logging.basicConfig(level=lvl)
    logging_initialized = True
Run Code Online (Sandbox Code Playgroud)

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

Vin*_*jip 4

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

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