37

我在 Google App Engine 上使用 Django-nonrel,这迫使我使用 logging.debug() 而不是 print()。

“日志记录”模块由 Django 提供,但我在使用它而不是 print() 时遇到了困难。

例如,如果我需要验证变量 x 中保存的内容,我会将
logging.debug('x is: %s' % x). 但是如果程序很快就崩溃了(没有刷新流),那么它就永远不会被打印出来。

因此,对于调试,我需要在程序因错误退出之前刷新 debug(),而这并没有发生。

4

4 回答 4

26

我认为这可能对你有用,假设你只使用一个(或默认)处理程序:

>>> import logging
>>> logger = logging.getLogger()
>>> logging.debug('wat wat')
>>> logger.handlers[0].flush()

不过,这在文档中有点不受欢迎。

应用程序代码不应直接实例化和使用 Handler 的实例。相反,Handler 类是一个基类,它定义了所有处理程序应具有的接口,并建立了一些子类可以使用(或覆盖)的默认行为。 http://docs.python.org/2/howto/logging.html#handler-basic

这可能会消耗性能,但如果你真的被卡住了,这可能有助于你的调试。

于 2012-12-06T22:39:21.797 回答
19

我遇到了类似的问题,这就是我解决它的方法。不要直接使用logging模块来输出您的日志,而是初始化您自己的记录器,如下所示:

import sys
import logging


def init_logger():
    logger = logging.getLogger()

    h = logging.StreamHandler(sys.stdout)
    h.flush = sys.stdout.flush
    logger.addHandler(h)

    return logger

然后,logging在您的代码中使用它而不是:

def f():
    logger = init_logger()
    logger.debug('...')

因此,您将不再有刷新日志的问题。

于 2017-09-06T02:11:34.807 回答
18

如果用例是您有一个 python 程序应该在退出时刷新其日志,请使用logging.shutdown().

从python文档:

logging.shutdown()

通知日志系统通过刷新和关闭所有处理程序来执行有序关闭。这应该在应用程序退出时调用,并且在此调用之后不应进一步使用日志系统。

于 2016-06-17T12:30:10.067 回答
6

Django 日志依赖于标准的 python 日志模块。

这个模块有一个模块级别的方法:logging.shutdown()它刷新所有的处理程序并关闭日志系统(即调用后不能再使用日志)

检查此函数的代码显示当前(python 2.7)日志记录模块在名为 _handlerList 的模块级变量中保存对所有处理程序的弱引用列表,因此可以通过执行类似操作来刷新所有处理程序

[h_weak_ref().flush() for h_weak_ref in logging._handlerList]

因为这个解决方案使用模块的内部结构 @Mikes 上面的解决方案更好,但它依赖于对记录器的访问,它可以概括如下:

 [h.flush() for h in my_logger.handlerList]
于 2013-08-02T09:03:06.633 回答