python – 如何从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()

util模块的位置是:

import logging

logger = logging.getLogger(__name__)

def test():
    logger.info("info message from util")

当我只在控制台中运行“来自索引的信息消息”时.

将两个日志消息一起打印到控制台,以及同时打印到日志文件的最简单方法是什么.

我尝试了各种方法,没有一个对我有用.特别是从未出现过的util.

最佳答案 util中的记录器不生成输出,因为默认情况下将Python日志记录设置为记录警告,并且信息低于警告.使用所需的级别和处理程序配置Python的日志记录.

如果未配置日志记录,Flask会为其自己的记录器添加处理程序,并在调试模式下将级别设置为debug,这就是app.logger消息显示的原因. Flask’s docs show how to configure logging the way it does and other examples.

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

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

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

from flask import current_app

def test():
    current_app.logger.info('info message from util')
点赞