Проблемы с протоколированием Python Flask - PullRequest
0 голосов
/ 10 января 2019

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

Это мое простое приложение для фляги, я написал это, чтобы объяснить проблему, с которой столкнулся и застрял на некоторое время, пытаясь выяснить, что происходит с 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(..), файл журнала будет создан с соответствующими журналами отладки, которые у меня есть.

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

1 Ответ

0 голосов
/ 10 января 2019

Использование 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 в текущем рабочем каталоге, в то же время будут показаны некоторые типичные выходные данные журналирования, создаваемые флягой.

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