Cloudflare Logpush Jobs Silently Failing: Detecting the Gaps Before Your SIEM Has a Blind Spot
Reach 50,000+ security professionals
Sponsor a newsletter slot and put your brand in front of CISOs, engineers, and IT decision-makers.
Cloudflare Logpush delivers logs in batches to external destinations and verifies delivery by writing log files to the destination. If the destination rejects a write (due to a changed bucket policy, an expired credential, or a quota exhaustion), Cloudflare stops attempting delivery but does not disable the job or alert by default -- the job status stays enabled. For detection teams relying on Cloudflare WAF and DNS logs as a primary threat visibility source, a silent Logpush failure can persist for days before the gap is noticed. For Cloudflare WAF policy decisions that drive what gets logged, see this Cloudflare Bot Management vs Akamai Bot Manager comparison.
Root Causes: Why Logpush Jobs Silently Stop Delivering
Cause 1: Destination write permission revoked. The most common cause: after a Logpush job is created, the destination S3 bucket policy, Azure Blob SAS token, or Splunk HEC token is changed. Cloudflare attempts delivery, receives a permission error (HTTP 403 or equivalent), and stops retrying. The job stays enabled but no longer delivers.
Cause 2: Destination credential rotation. If the IAM access key (for S3), service principal (for Azure Blob), or API token (for Datadog, Splunk) used by the Logpush job is rotated without updating the job's configuration, all subsequent delivery attempts fail silently.
Cause 3: Destination quota or storage limit reached. An S3 bucket or Azure Blob container that hits its quota, an account that hits its Splunk storage limit, or a Datadog account that hits its log ingestion limit may respond to Logpush delivery attempts with errors. Cloudflare stops delivering without alerting.
Cause 4: Field format incompatibility after a Cloudflare log schema change. Cloudflare occasionally adds new fields or changes log field names across schema versions. Destinations that enforce strict schema validation (like a Splunk index with a fixed field list) may reject batches containing new unknown fields. Delivery fails while the Cloudflare dashboard shows the job as enabled.
Cause 5: Zone or account change that orphans the job. Moving a domain to a different Cloudflare account, changing the zone's plan, or deleting a Cloudflare Access application that was the trigger for logs can orphan an existing Logpush job. The job appears enabled but has no valid log source to pull from.
Detecting Silent Failures Proactively
Method 1: Poll the Logpush API for last_complete timestamp.
Cloudflare's Logpush API returns job metadata including the last successful delivery timestamp. Query it regularly:
curl -X GET \
"https://api.cloudflare.com/client/v4/zones/<zone-id>/logpush/jobs" \
-H "Authorization: Bearer <api-token>" \
-H "Content-Type: application/json"
The response includes each job's last_complete field. Set up a monitoring script that alerts if last_complete is more than 2x the job's frequency setting behind the current time.
Method 2: Monitor for log volume anomalies in the SIEM.
Set up a SIEM detection rule that alerts when the volume of Cloudflare log events drops below a threshold that is statistically anomalous for the time of day. Even a rough threshold (fewer than 10 events in a 15-minute window during business hours) catches complete delivery stoppages. This is simpler than it sounds: Cloudflare WAF and DNS produce high-volume, consistent log streams that make volume anomalies easy to detect.
Method 3: Enable Cloudflare Logpush alerts.
Cloudflare's dashboard (Notifications > Create Notification) includes a 'Logpush Health Alert' notification type. This notification fires when a Logpush job has not successfully delivered in a configured interval. Enable this alert and route it to your alerting channel. It is not enabled by default.
Briefings like this, every morning before 9am.
Threat intel, active CVEs, and campaign alerts, distilled for practitioners. 50,000+ subscribers. No noise.
Diagnosing the Root Cause After Detecting a Gap
Step 1: Check the job's error field.
The Logpush API job metadata includes an error_message field when delivery has failed:
curl -X GET \
"https://api.cloudflare.com/client/v4/zones/<zone-id>/logpush/jobs/<job-id>" \
-H "Authorization: Bearer <api-token>"
An error message like AccessDenied or NoSuchBucket for S3 destinations points directly to the destination permission issue.
Step 2: Validate destination write access manually.
For S3: attempt a test write from a machine that uses the same IAM credentials Cloudflare is using:
aws s3 cp /dev/null s3://<bucket>/<prefix>/test.txt --sse AES256
If this fails with AccessDenied, the bucket policy or IAM permission is the issue.
For Splunk: test the HEC token with a manual push:
curl -k https://<splunk-host>:8088/services/collector \
-H 'Authorization: Splunk <HEC-token>' \
-d '{"event":"test"}'
Step 3: Check for schema changes at the destination.
If write access is confirmed but delivery is still failing, check whether your destination enforces schema validation. For Splunk, review the index's field extraction configuration for new Cloudflare fields that may be triggering parsing errors.
Fixing the Root Cause and Restoring Delivery
Fix: Restore destination write permissions.
For S3: re-attach the Cloudflare Logpush bucket policy. The required policy is documented in Cloudflare's docs and includes s3:PutObject on the destination prefix. After updating the policy, re-verify the job by triggering a test delivery:
curl -X POST \
"https://api.cloudflare.com/client/v4/zones/<zone-id>/logpush/jobs/<job-id>/check" \
-H "Authorization: Bearer <api-token>"
Fix: Update rotated credentials.
Delete the existing Logpush job and recreate it with the new credentials. Logpush jobs store credentials at creation time and there is no in-place credential update path in the current API. Recreating the job requires re-running the ownership verification step, which writes a probe file to the destination.
Backfilling the gap using Cloudflare Logs Received API.
For events during the gap period, use the Cloudflare HTTP pull API to retrieve specific time ranges:
curl -X GET \
"https://api.cloudflare.com/client/v4/zones/<zone-id>/logs/received?start=<unix-start>&end=<unix-end>&fields=RayID,ClientIP,EdgeResponseStatus" \
-H "Authorization: Bearer <api-token>"
The maximum lookback is 7 days. Events older than 7 days cannot be retrieved via the pull API even if Logpush delivery was failing during that period.
Known Edge Cases
Logs delayed but not lost: batch delivery timing. Logpush delivers in batches, not in real time. The batch frequency is configurable (every 5 minutes to every 24 hours). A detection engineer expecting near-real-time logs may interpret the normal batch delay as a failure. Confirm the job's configured frequency matches your detection latency requirements.
High cardinality destinations filling up fast. Cloudflare WAF logs for high-traffic zones produce millions of events per day. An S3 bucket lifecycle policy that was set during low-traffic testing may no longer clear old logs fast enough, causing the bucket to hit a size limit that triggers put failures. Review bucket lifecycle and retention policies after any significant traffic increase.
Zone deletion removes the Logpush job. If a Cloudflare zone is deleted, its associated Logpush jobs are also deleted and do not automatically transfer to another zone or account. After zone migration or account restructuring, audit the Logpush jobs in the destination account to confirm coverage has not changed.
Hardening Against Future Silent Failures
To prevent silent Logpush failures from recurring:
- Enable the Cloudflare 'Logpush Health Alert' notification for every production job.
- Add a SIEM alert on Cloudflare log volume drops (fewer events than your 10th percentile baseline for a 30-minute window during business hours).
- Set a calendar reminder to rotate Logpush-related credentials on a schedule and update the Logpush job at the same time -- not separately.
- Add the Logpush job ID and destination configuration to your credential rotation runbook so it is not omitted during key rotations.
- Poll the Logpush API's
last_completefield from a cron job and push the value as a custom metric to your monitoring platform.
The bottom line
Cloudflare Logpush jobs silently stop delivering when destination permissions change, credentials are rotated without updating the job, or destination quotas are hit -- and the job status stays 'enabled' throughout. Enable the Cloudflare Logpush Health Alert notification, monitor log volume in your SIEM against a baseline threshold, and poll the Logpush API's last_complete field from a cron job to catch gaps before an incident investigation reveals them. For cloud log coverage auditing across all your log sources, see this cloud log coverage audit guide.
Frequently asked questions
Why is Cloudflare Logpush silently failing without any error?
Cloudflare Logpush jobs do not automatically disable or alert when delivery fails. If the destination returns an error (such as a 403 from S3 or a rejected HEC token from Splunk), Cloudflare stops retrying delivery but keeps the job in an 'enabled' state. The job's error_message field in the Logpush API response records the failure reason, but this field is not surfaced in the dashboard without an alert configured. The result is silent log delivery stoppage that is typically discovered only when an investigation reveals a gap in SIEM coverage.
How do I check if a Cloudflare Logpush job is actually delivering logs?
Query the Cloudflare Logpush API for the job's last_complete timestamp: `GET /zones/<zone-id>/logpush/jobs/<job-id>`. The last_complete field shows the timestamp of the most recent successful log batch delivery. If this timestamp is significantly older than the job's configured batch frequency, delivery has stopped. Cross-reference this with your SIEM: if log events from Cloudflare stopped appearing at approximately the same time last_complete stopped updating, the Logpush job is the problem.
How do I backfill Cloudflare logs for the period when Logpush was not delivering?
Use the Cloudflare Logs Received API (HTTP pull API) to retrieve logs for a specific time range. Query it with start and end Unix timestamps: `GET /zones/<zone-id>/logs/received?start=<unix>&end=<unix>&fields=<fields>`. This API is available for up to 7 days of historical data. For events older than 7 days, the data cannot be recovered via the pull API, and you must note the gap in your investigation timeline. Cloudflare also provides a Logpull endpoint through the dashboard under Analytics > Logs.
What permissions does Cloudflare Logpush need to write to an S3 bucket?
Cloudflare Logpush requires s3:PutObject permission on the destination bucket and prefix, s3:GetBucketLocation if server-side encryption is used, and s3:GetObject during the ownership verification step (Cloudflare writes a probe file and then attempts to read it back). The minimum bucket policy allows cloudflare.com's service account to PutObject at the configured key prefix. If server-side encryption is enforced by the bucket policy, the s3:PutObject request must include the x-amz-server-side-encryption header, which Cloudflare includes automatically when the job is configured for SSE.
How do I set up an alert when Cloudflare Logpush stops delivering?
Enable the Cloudflare native Logpush Health Alert: in the Cloudflare dashboard go to Notifications > Create Notification and select the Logpush Health Alert type. This alert fires when a job has not completed a successful delivery in a configured interval. Additionally, add a SIEM detection rule that alerts when the volume of Cloudflare log events drops below a statistical threshold for the time of day. Both approaches together provide redundant coverage: the Cloudflare native alert catches delivery failures early, and the SIEM volume alert catches cases where the native alert itself is misconfigured.
What happens to Cloudflare logs during a Logpush job failure period?
Cloudflare continues to generate and buffer logs during a Logpush delivery failure. The buffered logs are available for retrieval via the Logs Received API (HTTP pull) for up to 7 days. Events older than 7 days are no longer retrievable after the retention window expires. When Logpush delivery is restored, the job resumes from the current time and does not automatically backfill the gap -- you must use the pull API to retrieve events from the gap period separately.
Sources & references
Free resources
Critical CVE Reference Card 2025–2026
25 actively exploited vulnerabilities with CVSS scores, exploit status, and patch availability. Print it, pin it, share it with your SOC team.
Ransomware Incident Response Playbook
Step-by-step 24-hour IR checklist covering detection, containment, eradication, and recovery. Built for SOC teams, IR leads, and CISOs.
Daily briefings + Google Top Stories in one step.
Enter your email and we'll subscribe you to the daily briefing and add Decryption Digest to your Google Search feed at the same time.

Founder & Cybersecurity Evangelist, Decryption Digest
Cybersecurity professional with expertise in threat intelligence, vulnerability research, and enterprise security. Covers zero-days, ransomware, and nation-state operations for 50,000+ security professionals every morning.
