Проблемы с протоколированием Python Flask

1

Я собираюсь написать приложение для колб для чего-то очень тривиального... и я наткнулся на контрольно-пропускной пункт в моей практике ведения журналов.

Это мое простое приложение для работы с флягами, я написал это, чтобы объяснить проблему, с которой столкнулся и застрял на некоторое время, пытаясь выяснить, что происходит с python-logging & flask.

# standard
from flask import Flask
from flask_restful import Api
import logging
import json

# logging config
log_fmt = "%(asctime)s %(levelname)s %(process)d %(filename)s %(funcName)s %(message)s"
logging.basicConfig(
    filename="test.log",
    filemode="w",
    format=log_fmt,
    level=logging.DEBUG
)

# create an object of flask (flask is a web framework)
app = Flask(__name__)
api = Api(app)


# health check /
@app.route("/", methods=['GET'])
def default():
    logging.debug("/ request received")
    out_dict = {
        "hello": "world"
    }
    logging.debug("/ response" + str(out_dict))
    return json.dumps(out_dict)


# main function, entry point
if __name__ == "__main__":

    # invokes src and runs the application
    logging.debug("starting")
    # COMMENTING below - gets me the log file! Whats happening with flask & logging?
    app.run(host="0.0.0.0", port=7001, debug=True)
    logging.debug("stopping")

Теперь этот шаблон я обычно использую, когда мне нужно войти. Но когда я применяю этот шаблон ведения журнала вместе с app.run(..) файл журнала никогда не создается. Я не могу понять, почему это происходит.

Но наоборот.. если я прокомментирую app.run(..), файл журнала будет создан с соответствующими журналами отладки, которые у меня есть.

Я изо всех сил пытался понять это - и я приземлился на встроенный обработчик журнала колбы, но, глядя на его реализацию, он присоединяется к самому модулю регистрации. Так что все это все еще не имеет смысла. Любая помощь или направление здесь будут оценены.

Теги:
flask

1 ответ

0

Использование logging.basicConfig делает ряд предположений, которые при вызове app.run(...) могут быть отменены, так как Flask также использует модуль ведения журнала для настройки вывода журнала, как вы заметили. Однако, если вы вручную настроите обработчик файла и присоедините его к корневому логгеру, например, так (то есть замените раздел # logging config на):

# logging config
log_fmt = "%(asctime)s %(levelname)s %(process)d %(filename)s %(funcName)s %(message)s"
handler = logging.FileHandler('test.log')
handler.setFormatter(logging.Formatter(log_fmt))
root_logger = logging.getLogger()
root_logger.addHandler(handler)
root_logger.setLevel(logging.DEBUG)

Это устанавливает обработчик журналирования с форматером, установленным в log_fmt вы указали, затем присоединяет этот обработчик к корневому регистратору, возвращенному logging.getLogger(). Запустив приложение, test.log ему несколько запросов и выйдя, вы должны увидеть соответствующие записи, показанные внутри test.log в текущем рабочем каталоге, в то же время будут показаны некоторые типичные выходные данные журналирования, создаваемые flask.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню