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结束时调用),但这似乎没有帮助.
不要将basicConfig()用于这种使用方式 - 它用于简单的一次性配置,并且正如文档所述,第一次调用之后的后续调用没有任何效果(如果根记录器没有处理程序,它只会执行任何操作)。当您的脚本从 shell 提示符运行时,这没问题,但不是从交互式解释器、IPython、IDLE、PythonWin 或与您交互的进程不会退出的其他类似环境运行。
相反,使用编程配置,或fileConfig()或dictConfig() - 这些模式可以用新的配置完全替换现有的日志配置。
| 归档时间: |
|
| 查看次数: |
1695 次 |
| 最近记录: |