内容提要
CloudFront Functions新增cf.logCustomData()方法,可将自定义数据写入访问日志。示例展示如何记录查询字符串中的流量来源(如utm_source),需配置日志字段并验证结果。该方法无额外费用,数据自动URL编码,每字段最多800字节,多次调用仅保留最后值,且不支持嵌入式接入点。适用于A/B测试、鉴权分类等场景,但需避免记录敏感信息。
延伸解读
与 console.log() 的定位差异
cf.logCustomData() 与 console.log() 用途不同:前者将数据写入访问日志,便于与请求结果关联分析;后者仍用于开发和故障排查。选择时需根据场景判断,若需结合 URI、状态码等分析函数决策,应使用前者。
配置要点与常见误区
启用自定义日志字段是关键步骤,若未在标准日志记录(v2)的 Field selection 中选择 viewer-request-log-data,即使函数调用也不会输出。实时日志需单独配置且采样率低于 100% 时可能丢失请求。验证时需核对 x-amz-cf-id 与 x-edge-request-id 的一致性。
数据限制与安全提醒
每个字段最多 800 字节,超出截断;多次调用仅保留最后值,需合并写入。数据自动 URL 编码,注意解码。严禁记录密码、Authorization 头、会话 Cookie、JWT、API 密钥等敏感信息,避免安全风险。
Q&A
CloudFront Functions 新增的 cf.logCustomData() 方法有什么作用?
cf.logCustomData() 是 CloudFront Functions 新增的辅助方法,可以将函数产生的自定义数据(如业务决策或提取的字段)写入当前请求的 CloudFront 访问日志,与 URI、状态码和缓存结果保存在同一条记录中,便于后续分析。
如何使用 CloudFront Functions 记录查询字符串中的 utm_source 参数?
创建一个使用 JavaScript 运行时 2.0 的 CloudFront Function,在查看器请求事件中调用 cf.logCustomData(),将提取的 utm_source 和 gclid 值以 JSON 字符串形式传入。发布函数并关联到目标缓存行为的查看器请求事件,然后在标准日志记录(v2)的字段选择中加入 viewer-request-log-data,并配置日志目的地。
cf.logCustomData() 写入的数据会出现在 CloudFront 访问日志的哪个字段?
对于查看器请求函数,数据写入 viewer-request-log-data 字段;对于查看器响应函数,写入 viewer-response-log-data 字段。标准日志记录(v2)和实时日志均支持这两个字段。
使用 cf.logCustomData() 有哪些限制和注意事项?
注意事项包括:方法只接受一个字符串,对象需先 JSON.stringify();数据自动 URL 编码,每字段最多 800 字节,超出截断;单次执行多次调用只保留最后一个值;未调用或未选择日志字段时值为 '-' 或不出现在输出中;嵌入式接入点不支持;不要记录敏感信息如密码、Authorization 请求头、会话 Cookie、JWT、API 密钥或个人身份信息。
cf.logCustomData() 会产生额外费用吗?
不会。调用 cf.logCustomData() 不产生额外费用,CloudFront Functions、访问日志和投递服务仍按各自方式计费。
cf.logCustomData() 与 console.log() 有什么区别?
cf.logCustomData() 将数据写入 CloudFront 访问日志,与请求记录关联,适合生产环境分析;console.log() 写入 CloudWatch Logs,适合开发和故障排查。两者用途不同。
cf.logCustomData() 可以用于哪些场景?
可以用于记录流量来源(如 utm_source)、A/B 测试的实验名称和分组、鉴权结果分类(不记录凭证)、URL 重写或源站路由策略、机器人分类、缓存键维度或业务跟踪 ID,以及查看器响应函数产生的内容版本等。