python - 在 python 中登录到控制台时显示额外的字段

标签 python python-logging

我从 logging.ini 文件中进行了基本设置,以便我的控制台打印人类可读的日志,但我将类似 JSON dict 的日志打印到文件中,因此我的 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 出现(我不关心额外参数的确切出现顺序,只关心它们出现的顺序)?

最佳答案

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'}

关于python - 在 python 中登录到控制台时显示额外的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56559971/

相关文章:

从 loop.create_task() 引发的 python asyncio 异常

Python 跨子类共享日志记录

python - 如何获取当前的 python 日志记录配置?

python - 从任何地方执行 python 脚本

python - PYCHARM导入caffe报错

Python 循环 double 印

python-3.x - C 扩展 - 如何将 printf 重定向到 python 记录器?

python-3.x - 如何在 python 的单独设置文件中配置颜色、格式等日志记录?

python相当于lisp中的引号

python - 如何从 pandas 数据框中的特定列写入多个 Excel 工作表?