[英]Converting standard string based logging to json key-value based in 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.