Тело запроса журнала Python Flask через все модули

1

Я пытаюсь зарегистрировать тело запроса входящего почтового запроса и сохранить его во всех модулях, вызываемых в функции после этого. Вот пример того, чего я пытаюсь достичь:

main_app.py

from flask import Flask
from other_file import other_module
import logging

FORMAT = '%(request_body_id)s- %(message)s'
logging.basicConfig(format=FORMAT)
log = logging.getLogger('test_logger')
@app.route('/', methods=['POST'])
def test_function():
   log = logging.LoggerAdapter(log, {'request_body_id': request.body['id']})
   log.info("My message")
   other_module()
   return "foo"

other_file.py

log = logging.getLogger('test_logger')
def other_module():
   log.info("My second message")

Я ищу:

>>> INFO 123456- My message
>>> INFO 123456- My second message

Я получаю:

>>> INFO 123456- My message
>>> INFO - My second message

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

  • 1
    Ну, похоже, что в вашем other_file.py вы не находитесь на маршруте Flask. Таким образом, у вас может не быть значения для request_body_id . Выезд: регистрация . Нет?
  • 0
    Как насчет передачи request.body ['id'] в качестве параметра в функцию other_module ()?
Показать ещё 1 комментарий
Теги:
flask
logging

1 ответ

1

Вы можете добавить любые дополнительные данные в журнал, используя logging.Formatter. Просто пример:

log.py

import logging
from flask import request


class __RequestFormatter(logging.Formatter):

    def format(self, record):
        # you can set here everything what you need
        # I just added url and id from GET parameter
        record.id = request.args.get('id')
        record.url = request.url
        return super().format(record)

# format of our log record.
# print url and id of record which was set in format()
__stream_handler = logging.StreamHandler()
__stream_handler.setFormatter(__RequestFormatter(
    '[%(asctime)s %(levelname)s] requested: %(url)s, id: %(id)s in %(module)s: %(message)s'
))

logger = logging.getLogger('my_loger')
logger.setLevel(logging.INFO)
logger.addHandler(__stream_handler)

app.py

from flask import Flask

from log import logger
from other_file import other_module

app = Flask(__name__)


@app.route('/test')
def test():
    logger.info('/test was called')
    other_module()
    return 'hi'

other_file.py

from log import logger


def other_module():
   logger.info("My second message")

Теперь пусть call /test?id=example_id, /test?id=example_id2 и проверит журналы:

[2018-09-28 17:40:48,669 INFO] requested: http://127.0.0.1:5000/test?id=example_id, id: example_id in app: /test was called
[2018-09-28 17:40:48,670 INFO] requested: http://127.0.0.1:5000/test?id=example_id, id: example_id in other_file: My second message

[2018-09-28 17:40:51,475 INFO] requested: http://127.0.0.1:5000/test?id=example_id2, id: example_id2 in app: /test was called
[2018-09-28 17:40:51,476 INFO] requested: http://127.0.0.1:5000/test?id=example_id2, id: example_id2 in other_file: My second message

Как вы можете видеть, все сообщения включают id запроса. Таким образом, вы можете использовать Formatter для настройки всего, что вам нужно. Также вы можете попробовать использовать flask-log-request-id.

Надеюсь это поможет.

Ещё вопросы

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