Как добавить контекстную информацию в логи от многопроцессорных рабочих? - PullRequest
0 голосов
/ 06 июля 2011

У меня есть пул рабочих процессов (с использованием multiprocessing.Pool), и я хочу войти из них в один файл журнала.Мне известны серверы журналирования, системный журнал и т. Д., Но все они, похоже, требуют некоторых изменений в том, как мое приложение установлено, отслеживается, обрабатываются журналы и т. Д., Которых я хотел бы избежать.

Я использую CPython 2.6в Linux.

Наконец-то я наткнулся на решение , которое почти работает для меня.Основная идея заключается в том, что вы запускаете процесс прослушивания журнала, настраиваете очередь между ним и рабочими процессами, а работники входят в очередь (используя QueueHandler), а затем прослушиватель форматирует и сериализует строки журнала в файл.,

Пока все это работает согласно решению, указанному выше.

Но затем я хотел, чтобы работники записывали некоторую контекстную информацию, например, токен задания, для каждой строки журнала.В методе pool.apply_async() я могу передать контекстную информацию, которую я хочу зарегистрировать.Обратите внимание, что меня интересует только контекстная информация, когда работник выполняет определенную работу;когда он простаивает, не должно быть никакой контекстной информации, если работник хочет что-то записать.Таким образом, в основном у прослушивателя журнала формат журнала указан примерно так:

"%(job_token)s %(process)d %(asctime)s %(msg)"

, и рабочие должны предоставить job_token в качестве контекстной информации в записи журнала (остальные описатели формата являются стандартными).

Я просмотрел пользовательских фильтров журнала .С помощью настраиваемого фильтра я могу создать фильтр при запуске задания и применить фильтр к корневому регистратору, но я использую сторонние модули, которые создают свои собственные регистраторы (обычно во время импорта модуля), и мой настраиваемый фильтр к ним не применяется.

Есть ли способ заставить это работать в вышеуказанной настройке?Или есть какой-то альтернативный способ заставить это работать (помните, что я все еще предпочел бы один файл журнала, без отдельных серверов журналов, контекстную информацию о задании для рабочих строк журнала)?

1 Ответ

0 голосов
/ 11 июля 2011

Фильтры могут применяться как к обработчикам, так и к регистраторам - так что вы можете просто применить фильтр к вашему QueueHandler.Если этот обработчик присоединен к корневому логгеру в ваших процессах, то всякая регистрация сторонними модулями также должна обрабатываться обработчиком, поэтому вы должны также получить контекст в этих регистрируемых событиях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...