繁体   English   中英

将基于标准字符串的日志记录转换为基于 Python 的 json 键值

[英]Converting standard string based logging to json key-value based in Python

我的要求是从基于标准字符串的日志记录创建 json(基于字典键值)python 日志记录,因为我们需要将所有日志推送到 Splunk,并且可以更好地搜索基于键/值的日志记录,在日志聚合器工具中进行查询。

我正在使用下面的代码。它正在生成基于键/值的日志记录,但它也在打印标准(基于字符串的日志)。

请建议如何仅获取基于结构化(键/值)的日志,而不是基于 Python 的标准字符串

在此处输入图像描述

谢谢

只需将记录器名称从"json"更改为"root" ,这将替换默认的基于字符串的记录器:

import logging
import json

def logging_override(name: str, extra: dict):
    logger = logging.getLogger(name)
    logger.setLevel(logging.INFO)
    stream_handler = logging.StreamHandler()
    basic_dict = {"time": "%(asctime)s", "level": "%(levelname)s", "message": "%(message)s"}
    full_dict = {**basic_dict, **extra}
    stream_formatter = logging.Formatter(json.dumps(full_dict))
    stream_handler.setFormatter(stream_formatter)
    if not logger.handlers:
        logger.addHandler(stream_handler)
    logger.handlers[0] = stream_handler
    logger = logging.LoggerAdapter(logger, extra)
    return logger

def main():
    extra = {"server_ip": "192.168.1.2", "username": "Jack Sparrow"}
    logger = logging_override("root", extra)
    logger.info("Sending Email to username: 'Jack Sparrow' regarding server_ip: '192.168.1.2'")

if __name__ == '__main__':
    main()

# Output:
# {"time": "2021-11-18 10:27:37,253", "level": "INFO", "message": "Sending Email to username: 'Jack Sparrow' regarding server_ip: '192.168.1.2'", "server_ip": "192.168.1.2", "username": "Jack Sparrow"}

使用以下食谱食谱支持此操作:

import json
import logging

class StructuredMessage:
    def __init__(self, message, /, **kwargs):
        self.message = message
        self.kwargs = kwargs

    def __str__(self):
        return '%s >>> %s' % (self.message, json.dumps(self.kwargs))

_ = StructuredMessage   # optional, to improve readability

logging.basicConfig(level=logging.INFO, format='%(message)s')
logging.info(_('message 1', foo='bar', bar='baz', num=123, fnum=123.456))

运行时,将打印

message 1 >>> {"fnum": 123.456, "num": 123, "bar": "baz", "foo": "bar"}

链接的配方中描述了更多选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM