Предотвратить Flask от двойной регистрации при запуске в консоли - PullRequest
0 голосов
/ 17 октября 2019

Я использую Python Flask и Connexion для создания REST API. Трудно понять, как протоколирование работает с использованием этих двух библиотек, и я столкнулся со странной проблемой с двойной регистрацией при попытке запустить / отладить локально.

app/log.py

import logging
from flask import g, has_request_context
import uuid

def request_id():
    if 'request_id' not in g:
        g.request_id = uuid.uuid4()

    return g.request_id

class AppFilter(logging.Filter):
    def filter(self, record):
        record.request_id = request_id() if has_request_context() else 'app'
        return True

formatter = logging.Formatter('%(asctime)s %(request_id)s %(module)s:%(levelname)s %(message)s')
handler = logging.StreamHandler()
handler.setFormatter(formatter)
handler.addFilter(AppFilter())

main.py

import connexion
from config import config
import json
import logging
from app.log import handler

# initiate swagger/connexion
application = connexion.App(__name__, specification_dir='./')
application.add_api('swagger.yml')

# logging
application.app.logger.handlers.pop() 
application.app.logger.addHandler(handler)
application.app.logger.setLevel(logging.DEBUG)
application.app.logger.debug('application starting...')

# if we're running in standalone mode, run the application
if __name__ == '__main__':
    application.run(host='0.0.0.0', port=5000)

Приведенный выше код позволяет мне использовать пользовательский формат журнала, в котором каждый запрос получает UUID на время выполнения запросов. Хотя это работает, я не могу понять, как остановить двойную регистрацию. Как вы можете видеть в main.py, я открываю (единственный) обработчик и добавляю свой собственный, и когда я печатаю обработчики в консоль, остается только один - тот, который я добавляю.

Это работает, но послеопределенное количество сообщений он просто начинает двойную регистрацию:

2019-10-17 10:00:22,737 09031bdb-5105-4b73-9e7d-a609f42a471e inbound:application starting...
2019-10-17 10:00:22,747 09031bdb-5105-4b73-9e7d-a609f42a471e inbound:INFO inbound
2019-10-17 10:00:22,755 09031bdb-5105-4b73-9e7d-a609f42a471e config:DEBUG Cache miss: 90002
2019-10-17 10:00:22,755 09031bdb-5105-4b73-9e7d-a609f42a471e firewall:DEBUG Connecting to x
2019-10-17 10:00:22,861 09031bdb-5105-4b73-9e7d-a609f42a471e firewall:DEBUG Get x for "90002"
2019-10-17 10:00:23,062 09031bdb-5105-4b73-9e7d-a609f42a471e firewall:DEBUG interfaces: source=v1 dest=v2
DEBUG:flask.app:interfaces: source=v1 dest=v2
2019-10-17 10:00:23,062 09031bdb-5105-4b73-9e7d-a609f42a471e firewall:DEBUG Found matching policy: 980cf552-5aaf-51e9-6c39-6480d51af2ad
DEBUG:flask.app:Found matching policy: 980cf552-5aaf-51e9-6c39-6480d51af2ad
2019-10-17 10:00:23,062 09031bdb-5105-4b73-9e7d-a609f42a471e firewall:DEBUG Found matching policy: eff53daa-b4f6-51e9-b79f-25b26b9f8537
DEBUG:flask.app:Found matching policy: eff53daa-b4f6-51e9-b79f-25b26b9f8537

Как будто обработчик был добавлен обратно. Я не уверен, что обработчик повторно добавляется, или я собираюсьоб этом неправильно.

Вот как я регистрируюсь во всем приложении, например:

inbound.py

from flask import request, current_app

def index():
    current_app.logger.info('inbound')
    # do stuff....

1 Ответ

1 голос
/ 17 октября 2019

Используйте

application.app.logger.handlers.clear()

вместо

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