Показать дополнительные поля при входе в консоль в python - PullRequest
1 голос
/ 12 июня 2019

У меня есть базовая установка из файла logging.ini, так что моя консоль печатает журналы, удобные для чтения человеком, но я печатаю журналы, похожие на диктофон JSON, чтобы мой ELK мог обрабатывать журналы.

[formatter_json]
class=pythonjsonlogger.jsonlogger.JsonFormatter
format=%(asctime)s %(name)s %(levelname)s %(message)s

[formatter_simpleFormatter]
format=%(asctime)s %(name)s - %(levelname)s:%(message)s

При регистрации сообщений я часто добавляю дополнительные поля, ad-hoc, например:

logger.info("hello world, I like the word %s", "cowabanga", extra={"more":15})

И вот поле more:15 появляется в строке журнала в моем файле. Но он не появляется в консоли, который просто сказал бы 2019-06-12 13:25:02,189 root - INFO:hello world, I like the word cowabanga . Что мне нужно сделать, чтобы появилось 15 или more:15 (мне все равно, в каком порядке будут появляться дополнительные параметры, только то, что они появляются)?

1 Ответ

0 голосов
/ 12 июня 2019

Параметр extra просто игнорируется стандартным форматером.

Это означает, что вам потребуется пользовательский Formatter для удобной обработки дополнительных аргументов. Например, этот класс ищет дополнительные параметры в LogRecord и, если они есть, добавляет - extra {key: value, ...} к сообщению:

class ExFormatter(logging.Formatter):
    def_keys = ['name', 'msg', 'args', 'levelname', 'levelno',
            'pathname', 'filename', 'module', 'exc_info',
            'exc_text', 'stack_info', 'lineno', 'funcName',
            'created', 'msecs', 'relativeCreated', 'thread',
            'threadName', 'processName', 'process', 'message']
    def format(self, record):
        string = super().format(record)
        extra = {k: v for k,v in record.__dict__.items()
             if k not in self.def_keys}
        if len(extra)>0:
            string += " - extra: " + str(extra)
        return string

Демо-версия:

>>> log = logging.Logger('foo')
>>> hnd = logging.StreamHandler(sys.stdout)
>>> hnd.setFormatter(ExFormatter())
>>> log.addHandler(hnd)
>>> log.log(logging.INFO, 'foo', extra={'bar': 'baz'})
foo - extra: {'bar': 'baz'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...