2

我有一个logging.ini文件的基本设置,以便我的控制台打印人类可读的日志,但我将 JSON dict-like 日志打印到文件,所以我的 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

记录消息时,我经常添加额外的字段,即席,如下所示:

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 . 我需要做什么才能拥有15more:15出现(我不关心额外参数的出现顺序,只是它们出现)?

4

1 回答 1

1

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'}
于 2019-06-12T13:23:35.970 回答