#python #flask #python-logging
Вопрос:
У меня есть микросервис python flask, в котором мы используем библиотеку журналов python. Я хочу добавить идентификатор сеанса запроса или любой другой уникальный идентификатор для каждого сеанса в журналы, чтобы я мог легко просматривать журналы для этого конкретного запроса.
У нас есть микро-сервис на java, в котором мы сделали то же самое, используя это. Я хочу сделать то же самое в python.Как я могу это сделать?
Кроме того, у нас уже есть много журналов в нашем существующем коде, я хочу добиться этого, изменив существующий вызов журналов(или, может быть, немного изменив, например, передав некоторый аргумент функции журнала).
В настоящее время наш формат ведения журнала выглядит следующим образом
formatter = logging.Formatter('[%(asctime)s] - [%(threadName)s] [%(thread)d] - %(levelname)s in %(module)s at %(lineno)d: %(message)s')
Ответ №1:
Либо используйте адаптер, либо добавьте фильтр в свой журнал. Адаптер обернет ваш регистратор, в то время как с помощью фильтра вы будете изменять объект LogRecord.
Использование адаптера будет работать примерно так:
import logging
# either user flasks builtin app.logger, or replace with your own logger
request_id = 123 # implement however you prefer
app.logger = CustomAdapter(app.logger, {'request_id': request_id})
и используйте %(request_id)s
где-нибудь в своем форматере. app.logger
является стандартным регистратором, который предоставляет flask.
Комментарии:
1. Спасибо за ваш ответ. Я не понимаю, куда мне следует поместить строки, которые вы предложили. у меня есть контроллеры, службы и функции utils. я хочу добавить идентификатор запроса или какой-то уникальный идентификатор для каждого сеанса, не могли бы вы объяснить немного больше.
2. Вы помещаете эти строки в самый ранний момент, когда регистратор доступен и известен идентификатор запроса, так как после этой строки каждый журнал, созданный с
app.logger
помощью, будет обладатьrequest_id
свойством. Это зависит от настроек вашего приложения, но найти лучшее место не должно быть слишком сложно.3. Он работает для тех же файловых журналов, что и контроллер. когда поток управления переходит от контроллера к сервисной функции, как я могу поддерживать тот же идентификатор(созданный контроллером) и для журналов служб? а также одна и та же сервисная функция может быть вызвана со многих контроллеров!