当 Cloudflare Worker 拦截访客请求时,它可以发出称为子请求的额外出站 fetch 调用。默认情况下,每个子请求都会在 Logpush 中生成自己的日志条目,从而导致单个面向访客的请求产生多条日志行。
每个请求阶段都可以通过其日志字段进行识别。你也可以选择启用子请求合并,将子请求日志条目聚合到其父请求中,使 Logpush 任务为每个访客请求仅交付一条日志行。
每个请求阶段都会生成自己的日志行。你可以使用以下字段区分它们。
访客请求 — 访客对你的 zone 的原始请求:
- ClientRequestSource == "eyeball"
源站请求 — 从 Cloudflare 转发到你的源站服务器的请求:
- OriginIP != "",或
- OriginResponseStatus != 0(例如,OriginResponseStatus == 200)
Worker 子请求 — 由 Worker 发出的 fetch 调用:
- WorkerSubrequest == true
- ClientRequestSource == "edgeWorkerFetch"
要将子请求日志与其父请求关联,请将子请求的 ParentRayID 字段与父请求的 RayID 匹配。
子请求合并是 http_requests 数据集上的可选功能。启用子请求合并后,你的 Logpush 任务为每个访客请求交付一条日志行,子请求数据作为父日志记录上的嵌套数组字段嵌入。
- 每个父请求最多合并 50 个子请求。超出此限制的子请求将作为单独的日志条目原样通过。
- 子请求必须在访客请求后 5 分钟内完成。超出此时间窗口的子请求将原样通过。
启用子请求合并后,会向每个父请求日志记录添加 Subrequests 字段(array<object>)。数组中的每个元素包含该子请求的标准 http_requests 字段。
数组仅包含根据上述资格标准符合合并条件的子请求。不符合条件的子请求将作为单独的日志条目出现。如果请求没有子请求,或没有符合条件的子请求,该字段将为空([])。
可以通过 API 或 Cloudflare 仪表板启用子请求合并。
- 在 Cloudflare 仪表板中,前往域名(也称为 zone)级别的 Logpush 页面。 Go to Logpush ↗
- 选择 Create a Logpush job,或在现有的 http_requests 任务旁选择 Edit。
- 在 Advanced Options 下,启用 Subrequest merging 开关。
- 选择 Save。
- 要在新任务上启用子请求合并,请在请求正文中设置
"merge_subrequests": true。
至少需要以下令牌权限之一:
- Logs Write
创建 Logpush 任务
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/logpush/jobs" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"name": "<DOMAIN_NAME>",
"destination_conf": "s3://<BUCKET_PATH>?region=us-east-1",
"dataset": "http_requests",
"output_options": {
"field_names": [
"ClientIP",
"ClientRequestHost",
"ClientRequestMethod",
"ClientRequestURI",
"EdgeStartTimestamp",
"EdgeResponseStatus",
"RayID",
"ParentRayID",
"Subrequests"
],
"timestamp_format": "rfc3339"
},
"merge_subrequests": true,
"enabled": true
}'要在现有任务上启用子请求合并:
更新 Logpush 任务
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/logpush/jobs/$JOB_ID" \
--request PUT \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"merge_subrequests": true
}'未启用子请求合并时,发出一个子请求的 Worker 会产生两条单独的日志记录:
{"RayID":"abc123","ParentRayID":"","ClientIP":"203.0.113.1","EdgeResponseStatus":200, ...}
{"RayID":"def456","ParentRayID":"abc123","ClientIP":"203.0.113.1","EdgeResponseStatus":200, ...}启用子请求合并后,会生成一条将子请求嵌套在内的记录:
{
"RayID": "abc123",
"ParentRayID": "",
"ClientIP": "203.0.113.1",
"EdgeResponseStatus": 200,
"Subrequests": [
{
"RayID": "def456",
"ClientIP": "203.0.113.1",
"EdgeResponseStatus": 200
}
]
}