如何从 Flask 中的单独模块登录

Phi*_*lip 8 python logging flask

我有一个简单的 Flask 应用程序,如下所示:

from flask import Flask
import util

APP = Flask("app")
APP.debug = True

@APP.route('/', methods=['GET'])
def index():
    APP.logger.info("info message from index")
    util.test()
    return "hello world"

if __name__ == '__main__':
    APP.run()
Run Code Online (Sandbox Code Playgroud)

util 模块在哪里:

import logging

logger = logging.getLogger(__name__)

def test():
    logger.info("info message from util")
Run Code Online (Sandbox Code Playgroud)

当我运行时,控制台中只出现“来自索引的信息消息”。

将两条日志消息一起打印到控制台并同时打印到日志文件的最简单方法是什么。

我尝试了各种方法,但没有一个对我有用。特别是 util one 永远不会出现。

Cal*_*mah 6

使用current_app访问应用程序的记录:

from flask import current_app

def test():
    current_app.logger.info("info message from util")
Run Code Online (Sandbox Code Playgroud)

这允许您使用默认的 Flask 记录器。

更多信息:http : //flask.pocoo.org/docs/logging/


dav*_*ism 5

记录器util不会生成输出,因为 Python 日志记录默认设置为记录警告和更高,并且信息低于警告。使用您想要的级别和处理程序配置 Python 的日志记录。

如果未配置日志记录,Flask 会为其自己的记录器添加一个处理程序,并将级别设置为调试模式下的调试,这就是app.logger显示消息的原因。Flask 的文档展示了如何按照它的方式配置日志记录以及其他示例。

from logging.config import dictConfig

dictConfig({
    'version': 1,
    'formatters': {'default': {
        'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
    }},
    'handlers': {'wsgi': {
        'class': 'logging.StreamHandler',
        'stream': 'ext://flask.logging.wsgi_errors_stream',
        'formatter': 'default'
    }},
    'root': {
        'level': 'INFO',
        'handlers': ['wsgi']
    }
})

app = Flask(__name__)

from project import util
util.test()
Run Code Online (Sandbox Code Playgroud)

如果您util在调用 之前导入dictConfig,您会注意到日志记录仍然不起作用。这是因为 Python 在配置时会禁用现有的记录器。您可以通过添加'disable_existing_loggers': False到配置来防止这种情况发生,但是如果已经配置了记录器,您可能会看到重复的日志。或者,不要进入logger模块级别,在需要时将其放入函数中。


如果您特别想在其他地方使用该应用程序的记录器,则需要导入该应用程序。由于这很容易出现循环导入错误,甚至在使用应用程序工厂时不可能,因此请改用current_app在请求期间访问应用程序。

from flask import current_app

def test():
    current_app.logger.info('info message from util')
Run Code Online (Sandbox Code Playgroud)