Динамическое заполнение пользовательских полей журнала модуля для каждого запроса flask с использованием ProcessPoolExecutor - PullRequest
0 голосов
/ 23 марта 2020

Изначально я планировал использовать контекст запроса flask для хранения (сгенерированного) идентификатора запроса в сочетании с LoggerFormatter для добавления идентификатора запроса ко всем используемым операторам регистрации. Это хорошо работает для тех частей, которые не работают в контексте ProcessPoolExecutor. К сожалению, кажется невозможным использовать этот подход вместе с ProcessPoolExecutor из-за проблем с сериализацией (контекст запроса не может быть легко сериализован). Код для запуска ProcessPoolExecutor находится в своем собственном модуле со своим собственным регистратором. Само приложение flask может работать в многопоточном режиме.

Очевидным, но не очень элегантным способом было бы передать идентификатор запроса методу, который реализует ProcessPoolExecutor, и адаптировать все последующие операторы журналирования (этот метод снова использует несколько других классов с регистраторами, однако). Другой способ может состоять в том, чтобы вручную установить request_id пользовательского logging.Formatter перед запуском ProcessPoolExecutor и сбросить его позже, однако это может быть проблемой при запуске многопоточных флагов, так как 2 потока могут обновить член request_id такого Formatter.

Существует ли элегантный способ временно настроить регистратор всего модуля / пакета для каждого потока на использование пользовательских полей?

В псевдокоде:

from my_process_executor_module import process_executor_driver


# set custom logger field to request_id = 1234 only for current thread and all process executor threads/processes which will be started in my_process_executor_module
# run process executor
process_executor_driver.run(...)
# keep request_id for till end of request
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...