460 字
2 分钟
AWS Lambda 日志JSON优化

1. 背景#

AWS Lambda 函数运行时产生的日志会自动发送到 CloudWatch Logs。在 Python 函数中,最常见的做法是直接打印 event 对象来调试入参:

def lambda_handler(event, context):
print(event)
return {"statusCode": 200}

event 通常是一个嵌套较深的字典,直接 print 后在 CloudWatch 控制台里会被压缩成一整行,键值挤在一起,排查问题时几乎没法看。

2. 解决方法#

json.dumps 把字典序列化成格式化的 JSON 字符串再输出:

import json
def lambda_handler(event, context):
print(json.dumps(event))
return {"statusCode": 200}

如果想要带缩进的多行结构,加上 indent 参数:

print(json.dumps(event, indent=2))

输出效果对比:

# 直接 print(event)
{'key1': 'value1', 'nested': {'a': 1, 'b': 2}, 'list': [1, 2, 3]}
# print(json.dumps(event, indent=2))
{
"key1": "value1",
"nested": {
"a": 1,
"b": 2
},
"list": [
1,
2,
3
]
}

3. 常见问题#

3.1 中文被转义成 \uXXXX#

json.dumps 默认会把非 ASCII 字符转义。如果 event 中含中文,输出会变成 中文 这样的乱码。加上 ensure_ascii=False 即可正常显示:

print(json.dumps(event, indent=2, ensure_ascii=False))

3.2 对象无法序列化报错#

event 中含 datetimeDecimal 等非 JSON 原生类型时,json.dumps 会抛出 TypeError: Object of type ... is not JSON serializable。可以用 default=str 兜底,把无法识别的对象统一转成字符串:

print(json.dumps(event, indent=2, ensure_ascii=False, default=str))

4. 进阶:使用 logging 模块#

print 输出在 CloudWatch 中默认没有日志级别标记。生产环境更推荐用标准库 logging,可以区分 INFO / WARNING / ERROR,便于在 CloudWatch 中按级别过滤:

import json
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
logger.info(json.dumps(event, ensure_ascii=False, default=str))
return {"statusCode": 200}

提示:Lambda 运行环境已预配置了日志处理器,直接 getLogger() 即可,无需手动 addHandler

5. 小结#

  • 调试 Lambda 入参时,用 json.dumps 替代直接 print,日志可读性大幅提升。
  • 含中文加 ensure_ascii=False,含特殊类型加 default=str
  • 生产环境优先用 logging 模块,支持日志级别过滤。
AWS Lambda 日志JSON优化
https://blog.xeu.asia/posts/aws-lambda-log-json/
作者
Xeu
发布于
2025-09-15
许可协议
CC BY-NC-SA 4.0