尽早设置日志记录:在导入期间捕获警告

时间:2015-11-26 07:11:59

标签: python logging

我希望通过我希望处理日志的方式来处理所有警告。即使是在导入库期间发出的这些。

这意味着必须在导入库之前完成日志记录的配置。

经过一段时间的搜索,我认为在自定义sitecustomize.py中配置日志记录可能是一种解决方案。

但是sitecustomize.py只是很少有人知道它的黑魔法,甚至更少的人使用它。

是否有更明显的方法可以确保在导入库之前完成我的日志配置?

不幸的是,似乎无法通过环境变量配置日志记录。

更新

根据我的观点,我得不到任何可接受的答案。我认为你需要将登录分为两个责任区:

  • 环境:设置日志记录:哪种格式,哪些文件......
  • 代码:使用日志记录。发出信息,警告和错误消息。

第一行代码由python解释器执行后,区域"环境"已经对代码负责。现在做任何配置都为时已晚。我希望看到将日志记录设置为调用python解释器的一部分。

一个解决方案可能是环境变量:

PYTHON_LOGGING_CONFIG=/path-to-env/etc/config.yaml

或解释器的参数:

python --logging-config=path-to-env/etc/config.yaml script.py

2 个答案:

答案 0 :(得分:5)

如果您希望日志记录覆盖导入,显然没有办法在导入任何其他内容之前显式配置日志记录。

但是,如果您希望日志记录配置更加明显,那么有各种技巧可以帮助您实现这一点。例如,您的脚本可以像这样简短,只是为了强调特殊情况:

import siteconfiguration
siteconfiguration.configure_site()  # This must be done before any other import

import application


if __name__ == "__main__":
    application.run()

这仍然打破了将所有进口放在首位的规则,但它也清楚地说明了为什么要这样做。使用该代码的每个人都将了解您的意图。

  

特殊情况不足以打破规则。

     

虽然实用性胜过纯洁。

(Python的禅宗,蒂姆·彼得斯)

答案 1 :(得分:0)

显式导入机器

  

如果导入顺序很重要,或者文件顶部的import语句之间有代码,我不喜欢它。我喜欢使用自动化工具清理我的代码,这可能会破坏内容。

如果您希望某些事情发生首先,请先执行 。如果要修改import的工作方式,则需要在调用import之前执行此操作。如果您的问题是由您的编辑引起的,那么要么更改它,找到不重新排序子句的方法,要么将代码放在名字最先出现的模块中,例如: import aaaaaa_logging_overrides

说你的代码看起来像@zvone的解决方案;并且您的编辑重新排序来自:

的导入
import siteconfiguration
siteconfiguration.configure_site()  # This must be done before any other import

import application

import application
import siteconfiguration
siteconfiguration.configure_site()  # This must be done before any other import

我很可能会改变编辑。这非常类似于搞乱下面的代码,显然编辑器不应该重新排序导入并在路径操作之前将它们放入:

import sys
sys.path.append('/nfs/some/corp/dir')
import corp.module

使用sitecustomize

您的python内容位于sys.prefix下。应该有:

  • lib/python-*/site.py
  • lib/python-*/site-packages
  • lib/python-*/sitecustomize.py(可选,取决于您的管理员是否使用过)

e.g。

(test)/tmp/test > (4) cat lib/python2.7/sitecustomize.py
print 'imported sitecustomize'
(test)/tmp/test > (4) cat foo.py 
print 'executing foo'

运行示例:

(test)/tmp/test > (4) python foo.py 
imported sitecustomize
executing foo

正如你所说,这是黑魔法;因为运行脚本的用户可能不会期望某些其他随机代码(读取:可能不在其控制之下,而不是标准分发的一部分)来运行和改变行为。