У меня есть пул рабочих процессов (с использованием multiprocessing.Pool
), и я хочу войти из них в один файл журнала.Мне известны серверы журналирования, системный журнал и т. Д., Но все они, похоже, требуют некоторых изменений в том, как мое приложение установлено, отслеживается, обрабатываются журналы и т. Д., Которых я хотел бы избежать.
Я использую CPython 2.6в Linux.
Наконец-то я наткнулся на решение , которое почти работает для меня.Основная идея заключается в том, что вы запускаете процесс прослушивания журнала, настраиваете очередь между ним и рабочими процессами, а работники входят в очередь (используя QueueHandler
), а затем прослушиватель форматирует и сериализует строки журнала в файл.,
Пока все это работает согласно решению, указанному выше.
Но затем я хотел, чтобы работники записывали некоторую контекстную информацию, например, токен задания, для каждой строки журнала.В методе pool.apply_async()
я могу передать контекстную информацию, которую я хочу зарегистрировать.Обратите внимание, что меня интересует только контекстная информация, когда работник выполняет определенную работу;когда он простаивает, не должно быть никакой контекстной информации, если работник хочет что-то записать.Таким образом, в основном у прослушивателя журнала формат журнала указан примерно так:
"%(job_token)s %(process)d %(asctime)s %(msg)"
, и рабочие должны предоставить job_token
в качестве контекстной информации в записи журнала (остальные описатели формата являются стандартными).
Я просмотрел пользовательских фильтров журнала .С помощью настраиваемого фильтра я могу создать фильтр при запуске задания и применить фильтр к корневому регистратору, но я использую сторонние модули, которые создают свои собственные регистраторы (обычно во время импорта модуля), и мой настраиваемый фильтр к ним не применяется.
Есть ли способ заставить это работать в вышеуказанной настройке?Или есть какой-то альтернативный способ заставить это работать (помните, что я все еще предпочел бы один файл журнала, без отдельных серверов журналов, контекстную информацию о задании для рабочих строк журнала)?