Как войти из отдельного модуля во Flask - PullRequest
0 голосов
/ 22 мая 2018

У меня есть простое приложение 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")

Когда я запускаю, в консоли появляется только «информационное сообщение из индекса».

Какой самый простой способ заставить два сообщения журнала печатать вместе на консоли, а также одновременно печатать оба файла в файл журнала.

Я пробовал разные подходы, но ни одногоработал на меня.В частности, утилита никогда не появляется.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Регистратор в 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()

Если вы импортируете 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')
0 голосов
/ 22 мая 2018

Используйте current_app для доступа к регистратору приложения:

from flask import current_app

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

Это позволяет использовать регистратор Flask по умолчанию.

Дополнительная информация: http://flask.pocoo.org/docs/logging/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...