Python warnings.warn()与logging.warning()

时间:2012-03-07 02:30:19

标签: python logging warnings

warnings.warn()logging.warn()在做什么以及应该如何使用方面有什么区别?

4 个答案:

答案 0 :(得分:49)

我同意另一个答案 - logging用于记录,warning用于警告 - 但我想添加更多详细信息。

这是一个教程式的HOWTO,带您了解使用logging模块的步骤。 http://docs.python.org/2/howto/logging.html

它直接回答了你的问题:

  如果问题是可以避免的,那么库代码中的

warnings.warn()和   应修改客户端应用程序以消除警告

     

logging.warning()如果客户端应用程序无法执行任何操作   关于情况,但仍应注意事件

答案 1 :(得分:28)

logging.warning只需记录WARNING级别的内容,就像logging.infoINFO级别记录和logging.error日志ERROR级别一样1}}级别。它没有特殊的行为。

warnings.warn会发出Warning,可能会打印到stderr,完全被忽略,或者像普通Exception一样被抛出(可能会导致应用程序崩溃),具体取决于具体情况已发出Warning个子类以及您如何配置警告过滤器。默认情况下,警告将打印到stderr或忽略。

warnings.warn发出的警告通常很有用,但很容易被忽略(特别是如果您在后台进程中运行Python程序而不是捕获stderr)。因此,记录它们会很有帮助。 Python提供了logging模块和warnings模块之间的内置集成,让您可以执行此操作;只需在脚本开头调用logging.captureWarnings(True)warnings模块发出的所有警告都会自动记录在WARNING级。

答案 2 :(得分:16)

除了canonical explanation in official documentation

  如果问题是可以避免的,那么库代码中的

warnings.warn()应该修改客户端应用程序以消除警告

     

logging.warning()如果客户端应用程序无法处理该情况,但仍应注意该事件

值得注意的是,默认情况下warnings.warn("same message")只会出现一次。这是一个重大的显着差异。引自official doc

  

通常会抑制对同一源位置的特定警告的重复。

>>> import warnings
>>> warnings.warn("foo")
__main__:1: UserWarning: foo
>>> warnings.warn("foo")
>>> warnings.warn("foo")
>>>
>>> import logging
>>> logging.warn("bar")
WARNING:root:bar
>>> logging.warn("bar")
WARNING:root:bar
>>> logging.warn("bar")
WARNING:root:bar
>>>
>>>
>>> warnings.warn("fur")
__main__:1: UserWarning: fur
>>> warnings.warn("fur")
>>> warnings.warn("fur")
>>>

答案 3 :(得分:10)

一个引发可以根据需要捕获或忽略的异常,另一个可选地根据当前日志记录级别向日志添加条目。当一个人在代码中警告各种事情时应该使用一个,而在记录时应该使用另一个。