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

时间:2011-04-17 02:55:32

标签: 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

不幸的是,这很困难,因为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结束时调用),但这似乎没有帮助。

1 个答案:

答案 0 :(得分:4)

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

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