Python-如何刷新日志? (django的)

时间:2012-11-01 11:34:14

标签: python django google-app-engine logging django-nonrel

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

"记录"模块由Django提供,但我很难使用它而不是print()。

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

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

4 个答案:

答案 0 :(得分:12)

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

>>> 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

这可能会导致性能下降,但如果您真的遇到困难,这可能对您的调试有所帮助。

答案 1 :(得分:9)

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

来自python文档:

  

logging.shutdown()

     

通知日志记录系统有序执行   通过刷新和关闭所有处理程序来关闭。这应该被称为   在应用程序出口处,不应再使用日志记录系统   在这次电话会议后发表。

答案 2 :(得分:7)

我遇到了类似的问题,这就是我解决它的方法。而不是直接使用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('...')

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

答案 3 :(得分:5)

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]