将Flask日志级别从INFO改为DEBUG

23

Flask默认会使用INFO标签直接记录GET和POST请求等内容。在实现自定义日志记录器时,这些内容将被发布到同一个日志记录器,并混淆了我的INFO层次结构。有没有办法将它们降级到像DEBUG这样的其他层次结构?

这是我使用的日志记录器:

# create logger
FORMAT = '%(asctime)s - %(module)s - %(levelname)s - Thread_name: %(threadName)s - %(message)s'
logging.basicConfig(
    format=FORMAT, datefmt='%m/%d/%Y %I:%M:%S %p',
    filename='wizard/logs/example.log', level=logging.DEBUG)
3个回答

33

我不确定是否有一种方法可以降级请求的日志级别(因为通常会在代码中明确指定,如 logging.info("...")),但以下内容可能有助于减少 Flask 本身的冗余信息。

Python 允许你拥有多个记录器,每个记录器都有自己的日志级别。如果你知道模块名称或注册名称,就可以修改任何现有的记录器,具体描述请参见这里

例如:

import logging
logger = logging.getLogger("mypackage.mymodule")  # or __name__ for current module
logger.setLevel(logging.ERROR)

任何Python模块都可以执行上述操作。Flask为每个应用程序提供了一个记录器(logger)。您可以像这样获取对它的引用:

The above can be done for any python module. Flask provides a logger per app. You can get a reference to it like this:


import logging
from flask import Flask
app = Flask(__name__)  # or instead of __name__ provide the name of the module
app.logger.setLevel(logging.ERROR)

对了,问题是,尽管将应用程序的级别设置为ERROR可以从Flask中删除INFO日志,但是如果我想要查看DEBUG级别的日志而不看到INFO级别的日志,它就不允许了,对吧?我至少需要将所有的DEBUG级别日志都调整为ERROR才能使其工作。即使我使用getLogger函数,似乎Flask仍然会将INFO日志记录到我的日志器中... - ZekeDroid
你是否按照 @foobarto 的描述创建了自定义记录器?并且它能够同时报告你的自定义日志和 Flask 日志吗? - amccormack

10
事实上,有一种方法可以将日志记录从INFO级别降级到DEBUG级别(即使它已经使用info()等调用发出)。这可以通过附加到记录器的过滤器来实现。根据文档的说明,过滤器会检查:

要记录指定的记录吗?返回零表示不是,非零表示是。如果适当,此方法可以通过原址修改记录。

因此,过滤器可以更改日志记录的级别(levelnolevelname属性)。稍后,处理程序可以基于新级别允许或删除此记录。

1
这是正确的答案,不像其他解决方法那样笨拙。 - Gringo Suave

1

以防有人来到这里,

我也遇到了同样的问题。似乎打印调用有不运行的倾向。但是,如果您使用记录器而不是打印,您会发现代码实际上仍在运行。

不太确定原因是什么,但当代码的其他部分开始运行时,所有旧的打印都会突然出现。

tldr; 不要使用打印,使用记录器


1
Python缓冲“print”函数,这可能是你看到它的原因。你可以通过几种方式来解决它,详见此处:https://dev59.com/inVD5IYBdhLWcg3wDHDm - fbence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接