Cloudflare Logpush
Cloudflare Logpush는 HTTP 요청 로그를 Ahrefs로 자동 전송합니다. 트래픽이 많은 사이트에 권장되는 방법이지만, Cloudflare 엔터프라이즈 플랜이 필요합니다.
사전 준비 사항
- 모니터링하려는 Zone에 Cloudflare 엔터프라이즈 플랜이 있어야 합니다.
- 다음 권한이 있는 Cloudflare API 토큰:
- 영역 → 영역 → 읽기
- Zone → Logs → Edit
- 수동 설정의 경우에만: 설치 명령에서 Cloudflare 구성을 읽고 업데이트하는 데 사용하는
jq가 로컬에 설치되어 있어야 합니다.
Cloudflare API 토큰 가져오기
올바른 계정으로 Cloudflare 대시보드에 로그인되어 있는지 확인하세요. 그런 다음 https://dash.cloudflare.com/profile/api-tokens 페이지로 이동해 오른쪽 상단의 토큰 만들기 버튼을 찾아 클릭하세요:
이제 사용자 지정 토큰 생성 흐름을 진행하세요:
다음 정보를 입력하세요:
- API 토큰 이름: ahrefs-bot-analytics
- 다음 권한을 부여하세요:
- Ahrefs 봇 애널리틱스로 로그를 푸시하는 Logpush 작업을 구성하려면 Zone / Logs / Edit로 이동합니다.
- 구성할 영역을 찾을 수 있도록 Zone / Zone / Read
- Zone Resources는 Include / All Zones로 설정할 수 있으며, 또는 웹사이트 도메인에 해당하는 영역을 선택할 수도 있습니다.
이제 Continue to summary 버튼을 클릭하세요. 요약은 다음과 같이 표시됩니다:
이제 Create Token 버튼을 클릭하고, 생성된 토큰을 다음 단계에서 사용할 수 있도록 클립보드에 복사하세요.
추가 정보는 Cloudflare 문서의 API 토큰 생성 방법을 참고하세요.
자동 설정
- Ahrefs에서 프로젝트 설정 → 봇 애널리틱스로 이동합니다.
- 방법으로 Cloudflare Logpush를 선택합니다.
- Cloudflare API 토큰을 붙여넣고 Connect를 클릭합니다.
Ahrefs는 토큰을 사용하여 다음 작업을 수행합니다:
- 프로젝트의 도메인과 일치하는 Zone을 찾습니다.
- 기존 Logpush 작업 확인.
- Ahrefs로 로그를 보내는 새 작업을 만듭니다.
- 봇 검증 헤더(
signature,signature-input,signature-agent)가 로그에 포함되도록 존에 사용자 지정 로그 필드 규칙을 추가합니다. 존의 기존 규칙은 그대로 유지됩니다.
info
토큰은 한 번만 사용되며 저장되지 않습니다.
수동 설정
API 토큰을 제공하고 싶지 않다면 Cloudflare API를 사용해 Logpush 작업을 수동으로 설정할 수 있습니다.
1단계 — API 토큰 받기
-
Cloudflare 대시보드로 이동하여 웹사이트의 도메인을 선택합니다.
-
"API 토큰 받기"를 클릭한 다음, 다음 권한으로 새 토큰을 생성합니다.
- 영역 → 영역 → 읽기
- Zone → Logs → Edit
자세한 안내는 API 토큰 얻기를 참고하세요.
info
영역 ID를 따로 조회할 필요는 없습니다. 이 명령어들은 영역 → 영역 → 읽기 권한을 사용해 도메인에서 영역을 찾습니다.
2단계 — Logpush 작업 만들기
첫 번째 블록에 API 토큰을 입력한 다음, 아래 각 블록을 터미널에서 한 번에 하나씩 실행하고, 각각이 오류 없이 완료되는지 확인하세요. 이 명령어들을 함께 사용하면 영역을 찾고, Logpush 작업을 생성하고, 자동 설정에 설명된 사용자 지정 로그 필드 규칙을 추가합니다. 프로젝트 세부 정보가 미리 입력된 정확한 명령어는 프로젝트 설정 → 봇 애널리틱스 → 수동으로 설정에서 확인할 수 있습니다.
export CF_TOKEN="<your Cloudflare API token>"
BASE="https://api.cloudflare.com/client/v4"
Find the Cloudflare zone for yourwebsite.com
ZONE_ID=$(curl -s --fail-with-body "$BASE/zones?name=yourwebsite.com&status=active&match=all" \
-H "Authorization: Bearer $CF_TOKEN" | jq -r '.result[0].id // error("no active Cloudflare zone found for yourwebsite.com")')
echo "ZONE_ID=$ZONE_ID"
Remove the existing Logpush job if present
OLD_JOB_ID=$(curl -s --fail-with-body "$BASE/zones/$ZONE_ID/logpush/jobs" \
-H "Authorization: Bearer $CF_TOKEN" | jq -r '([(.result // [])[] | select(.name == "ahrefs-web-analytics-http-requests")])[0].id // ""')
echo "OLD_JOB_ID=$OLD_JOB_ID"
if [ -n "$OLD_JOB_ID" ]; then
curl -s --fail-with-body "$BASE/zones/$ZONE_ID/logpush/jobs/$OLD_JOB_ID" -X DELETE \
-H "Authorization: Bearer $CF_TOKEN"
fi
Create the Logpush job
curl -s --fail-with-body "$BASE/zones/$ZONE_ID/logpush/jobs" -X POST \
-H "Authorization: Bearer $CF_TOKEN" \
-H "Content-Type: application/json" \
--data-binary '{"name":"ahrefs-web-analytics-http-requests","destination_conf":"https://analytics.ahrefs.com/api/cf_logpush/http_requests?header_x-ahrefs-web-analytics-property=YOUR_PROPERTY_KEY","dataset":"http_requests","frequency":"high","filter":"{\"where\":{\"or\":[{\"key\":\"ClientRequestHost\",\"operator\":\"eq\",\"value\":\"yourwebsite.com\"},{\"key\":\"ClientRequestHost\",\"operator\":\"endsWith\",\"value\":\".yourwebsite.com\"}]}}","output_options":{"field_names":["ClientIP","ClientRequestMethod","ClientRequestHost","ClientRequestProtocol","ClientRequestScheme","ClientRequestURI","ClientRequestPath","ClientRequestUserAgent","ClientRequestReferer","EdgeStartTimestamp","EdgeEndTimestamp","EdgeResponseStatus","EdgeResponseBytes","EdgeResponseContentType","EdgeTimeToFirstByteMs","ClientCountry","ClientCity","ClientASN","ClientDeviceType","ClientRegionCode","BotScore","BotScoreSrc","BotTags","VerifiedBotCategory","RayID","RequestHeaders"],"timestamp_format":"unixnano"},"enabled":true}'
Add the custom log fields rule
RULES=$(curl -s --fail-with-body "$BASE/zones/$ZONE_ID/rulesets/phases/http_log_custom_fields/entrypoint" \
-H "Authorization: Bearer $CF_TOKEN" | jq -c '.result.rules // []')
echo "RULES=$RULES"
BODY=$(jq -nc --argjson rules "$RULES" \
'{rules: ([$rules[] | select(.description != "ahrefs-web-analytics-web-bot-auth-signature")] + [{"action":"log_custom_field","expression":"true","description":"ahrefs-web-analytics-web-bot-auth-signature","action_parameters":{"request_fields":[{"name":"signature"},{"name":"signature-input"},{"name":"signature-agent"}]}}])}')
curl -s --fail-with-body "$BASE/zones/$ZONE_ID/rulesets/phases/http_log_custom_fields/entrypoint" -X PUT \
-H "Authorization: Bearer $CF_TOKEN" \
-H "Content-Type: application/json" \
--data-binary "$BODY"
info
BotScore, BotScoreSrc, BotTags 필드는 Cloudflare Bot Management 구독이 있어야만 사용할 수 있습니다. 다만 봇 애널리틱스는 이 필드 없이도 작동하지만, 포함하면 봇 분류가 개선됩니다. 사용 중인 zone에 Bot Management가 없다면, 작업을 생성하기 전에 field_names에서 이 세 필드를 제거하세요.
warning
destination_conf URL과 property key는 프로젝트마다 고유합니다. 올바른 값이 적용되도록 프로젝트 설정 → 봇 애널리틱스 페이지에서 정확한 명령어를 복사하세요.
3단계 — 연결 확인
작업을 만든 후 Ahrefs의 프로젝트 설정 → 봇 애널리틱스로 돌아가서 상태 확인을 클릭해 데이터가 수신되고 있는지 확인하세요.