我在Google App Engine上使用Django-nonrel,这迫使我使用logging.debug()而不是print()。
"记录"模块由Django提供,但我很难使用它而不是print()。
例如,如果我需要验证变量x中保存的内容,我会将
logging.debug('x is: %s' % x)
。但是如果程序很快崩溃(没有刷新流),那么它就永远不会被打印出来。
因此,对于调试,我需要在程序退出错误之前刷新debug(),这不会发生。
答案 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的模块级变量中所有处理程序的弱引用列表,因此可以通过执行类似的操作来刷新所有处理程序p>
[h_weak_ref().flush() for h_weak_ref in logging._handlerList]
因为这个解决方案使用模块内部的@Mikes解决方案更好,但它依赖于访问记录器,它可以概括如下:
[h.flush() for h in my_logger.handlerList]