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 中含 datetime、Decimal 等非 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 jsonimport 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/