我在Google App Engine上使用Django-nonrel,这迫使我使用logging.debug()而不是print()。“logging”模块是Django提供的,但我在使用它而不是print()时遇到了一些困难。例如,如果我需要验证变量x中保存的内容,我将把但是如果程序很快就崩溃了(没有刷新流),那么它就永远不会被打印出来。因此,对于调试,我需要在程序因错误退出之前刷新debug(),但这并没有发生。
9rbhqvlz1#
我认为这对您可能有用,假设您只使用一个(或默认)处理程序:
>>> 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这可能会消耗性能,但如果您确实遇到了问题,这可能有助于您的调试。
lx0bsm1f2#
如果用例是python程序在退出时应该刷新日志,则使用logging.shutdown()。来自python文档:日志记录.shutdown()通知日志记录系统通过刷新和关闭所有处理程序来执行有序关闭。这应该在应用程序退出时调用,并且在此调用之后不应该进一步使用日志记录系统。[...]
logging.shutdown()
qncylg1j3#
Django日志依赖于标准的python日志模块。此模块具有模块级方法:logging.shutdown(),刷新所有处理程序并关闭日志记录系统(即日志记录在被调用后不能再使用)检查这个函数的代码可以发现,当前(python 2.7)logging模块在一个名为_handlerList的模块级变量中保存了一个对所有处理程序的弱引用列表,这样就可以通过执行如下操作来刷新所有处理程序
[h_weak_ref().flush() for h_weak_ref in logging._handlerList]
由于此解决方案使用了模块@Mikes的内部结构,因此上面的解决方案更好,但它依赖于对日志记录器的访问,因此可以概括如下:
[h.flush() for h in my_logger.handlerList]
kfgdxczn4#
改为刷新stdout/stderr:
stdout/stderr
sys.stdout.flush() sys.stderr.flush()
lstz6jyr5#
一个简单的函数,总是为注册你调试消息,而编程。不要使用它的生产,因为它不会旋转:
def make_log(message): import datetime with open('mylogfile.log','a') as f: f.write(f"{datetime.datetime.now()} {message}\n")
则用作
make_log('my message to register')
何时投产,只备注最后两行
def make_log(message): import datetime #with open('mylogfile.log','a') as f: # f.write(f"{datetime.datetime.now()} {message}\n")
5条答案
按热度按时间9rbhqvlz1#
我认为这对您可能有用,假设您只使用一个(或默认)处理程序:
不过,在文档中这有点令人不快。
应用程序代码不应直接示例化和使用Handler的示例。相反,Handler类是一个基类,它定义所有处理程序都应具有的接口,并建立一些子类可以使用(或重写)的默认行为。http://docs.python.org/2/howto/logging.html#handler-basic
这可能会消耗性能,但如果您确实遇到了问题,这可能有助于您的调试。
lx0bsm1f2#
如果用例是python程序在退出时应该刷新日志,则使用
logging.shutdown()
。来自python文档:
日志记录.shutdown()
通知日志记录系统通过刷新和关闭所有处理程序来执行有序关闭。这应该在应用程序退出时调用,并且在此调用之后不应该进一步使用日志记录系统。[...]
qncylg1j3#
Django日志依赖于标准的python日志模块。
此模块具有模块级方法:
logging.shutdown()
,刷新所有处理程序并关闭日志记录系统(即日志记录在被调用后不能再使用)检查这个函数的代码可以发现,当前(python 2.7)logging模块在一个名为_handlerList的模块级变量中保存了一个对所有处理程序的弱引用列表,这样就可以通过执行如下操作来刷新所有处理程序
由于此解决方案使用了模块@Mikes的内部结构,因此上面的解决方案更好,但它依赖于对日志记录器的访问,因此可以概括如下:
kfgdxczn4#
改为刷新
stdout/stderr
:lstz6jyr5#
一个简单的函数,总是为注册你调试消息,而编程。不要使用它的生产,因为它不会旋转:
则用作
何时投产,只备注最后两行