如何让structlog在Cloudwatch日志开头显示日志级别?
解决方案
你可以通过两种方式实现给Cloudwatch日志添加级别前缀的需求:
方法一:自定义structlog渲染器
直接修改structlog的处理器,在JSON输出前添加大写的级别前缀:
import logging import structlog class Logging: @staticmethod def my_logger() -> structlog.BoundLogger: def level_prefix_renderer(logger, method_name, event_dict): # 将日志级别转为大写 level = event_dict["level"].upper() # 使用structlog自带的JSONRenderer生成JSON字符串 json_str = structlog.processors.JSONRenderer()(logger, method_name, event_dict) # 返回带前缀的最终日志内容 return f"[{level}] {json_str}" structlog.configure( processors=[ structlog.processors.add_log_level, structlog.processors.TimeStamper(fmt="iso", key="ts"), level_prefix_renderer, # 替换原有的JSONRenderer ], wrapper_class=structlog.make_filtering_bound_logger(logging.INFO), ) logger = structlog.getLogger() return logger
方法二:结合logging模块的Formatter
如果你的项目已经在使用logging的Handler配置,可以通过structlog对接logging,利用logging的Formatter添加前缀:
import logging import structlog class Logging: @staticmethod def my_logger() -> logging.Logger: # 配置logging格式,添加[级别]前缀 formatter = logging.Formatter("[%(levelname)s] %(message)s") # 给所有已有Handler设置新的Formatter root_logger = logging.getLogger() for handler in root_logger.handlers: handler.setFormatter(formatter) structlog.configure( processors=[ structlog.processors.add_log_level, structlog.processors.TimeStamper(fmt="iso", key="ts"), structlog.processors.JSONRenderer(), structlog.processors.LoggingRenderer(), # 将处理后的日志传递给logging后端 ], wrapper_class=structlog.make_filtering_bound_logger(logging.INFO), logger_factory=structlog.stdlib.LoggerFactory(), ) logger = structlog.getLogger() return logger
两种方法最终都会输出你需要的格式:
2023-04-05T10:44:52.920+01:00 [INFO] {"event": "My logging message", "level": "info", "ts": "2023-04-05T09:44:52.919867Z"}
内容的提问来源于stack exchange,提问作者Omega
相关产品推荐
相关产品推荐

