Как переопределить существующий регистратор в другой библиотеке? - PullRequest
0 голосов
/ 27 октября 2018

Я использую библиотеку Python Tornado для своего веб-сервиса и хочу, чтобы каждый журнал, созданный из моего кода, а также из Tornado, был отформатирован в формате json.Я попытался установить средство форматирования в корневом логгере, настроить его и все остальные регистраторы.Это тот хак, который я сейчас пытаюсь заставить работать.Мне кажется, что это должно работать ... Однако, когда я запускаю приложение, все журналы Tornado все еще находятся в их стандартном формате.

import logging

from tornado.log import access_log, app_log, gen_log
import logmatic


loggers = [
    logging.getLogger(),
    logging.getLogger('tornado.access'),
    logging.getLogger('tornado.application'),
    logging.getLogger('tornado.general'),
    access_log,
    gen_log,
    app_log
]
json_formatter = logmatic.JsonFormatter()
for logger in loggers:
    for hand in logger.handlers:
        hand.setFormatter(json_formatter)

logging.getLogger('tornado.access').warning('All the things')
# WARNING:tornado.access (172.26.0.6) 0.47ms
# NOT JSON???

ПРИМЕЧАНИЕ: Когда явключите регистраторы для моей службы logging.getLogger('myservice') в список loggers и запустите их, они do получат обновленный форматер и выложат json.Это исключает проблемы с форматером logmatic.Не удается заставить модуль форматирования работать для регистраторов торнадо.

1 Ответ

0 голосов
/ 29 октября 2018

Регистраторы Tornado не имеют обработчиков до вызова loop.start () , поэтому вы должны добавить обработчик с предопределенным форматированием для регистраторов.

formatter = logging.Formatter(...)
handler = logging.StreamHandler()
handler.setFormatter(formatter)

for l in loggers:
    l.setLevel(logging.WARNING)
    l.addHandler(handler)
...