You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:10:39