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

woobm2wo  于 2023-03-11  发布在  Python
关注(0)|答案(5)|浏览(201)

我在Google App Engine上使用Django-nonrel,这迫使我使用logging.debug()而不是print()。
“logging”模块是Django提供的,但我在使用它而不是print()时遇到了一些困难。
例如,如果我需要验证变量x中保存的内容,我将把
但是如果程序很快就崩溃了(没有刷新流),那么它就永远不会被打印出来。
因此,对于调试,我需要在程序因错误退出之前刷新debug(),但这并没有发生。

9rbhqvlz

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
这可能会消耗性能,但如果您确实遇到了问题,这可能有助于您的调试。

lx0bsm1f

lx0bsm1f2#

如果用例是python程序在退出时应该刷新日志,则使用logging.shutdown()
来自python文档:
日志记录.shutdown()
通知日志记录系统通过刷新和关闭所有处理程序来执行有序关闭。这应该在应用程序退出时调用,并且在此调用之后不应该进一步使用日志记录系统。[...]

qncylg1j

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

kfgdxczn4#

改为刷新stdout/stderr

sys.stdout.flush()
sys.stderr.flush()
lstz6jyr

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

相关问题