Изначально я планировал использовать контекст запроса 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