Archive audit logs to S3 or S3-compatible object storage
Try free on Pangolin Cloud
Fastest way to get started with Pangolin using the hosted control plane. No credit card required.
S3 destinations upload batches of your organization’s audit logs as objects in a bucket you control. Use them for long-term archival, data lakes (Athena, Glue, BigQuery), or S3-compatible stores such as MinIO and Cloudflare R2.
An S3 destination writes one object per batch via PutObject. Each object contains up to 250 events of a single log type. There is no custom body template or field mapping; Pangolin serializes every event in a fixed shape and chooses the object key automatically.Configure:
Settings: Name, credentials, region, bucket, optional prefix and custom endpoint.
Format: File format (JSON array, NDJSON, or CSV) and optional gzip compression.
Gzip compression (optional): When enabled, the object body is gzip-compressed before upload, Content-Encoding: gzip is set, and the object key gets a .gz suffix (for example ….json.gz). Decompress before parsing unless your tool handles gzip automatically.File format:
Choose which log categories are uploaded. Each enabled type is written to its own key prefix (request/, action/, etc.). Only log types enabled for your organization can be streamed.
Enabling multiple log types on one destination produces separate object streams under different logType/ segments. A single object never mixes log types.
Event time as ISO-8601 UTC (connection logs use session start)
data
The complete stored log row for that record, not a curated subset
Some columns are stored as JSON strings in the database (headers, query, and metadata on request logs, for example). In data, they appear as string values, not nested JSON objects. Parse them in your pipeline if you need structured fields.
Objects are written per batch (up to ~250 events), not one object per log line.
Pangolin polls for new logs on a regular interval and may write multiple objects during catch-up after a pause.
No backfill: New destinations start from the current log cursor. Historical logs already in Pangolin are not uploaded.
Extended outage: If the destination is unreachable for about 24 hours, the backlog may be discarded and streaming resumes from the present cursor (same behavior as HTTP streaming).
The object key includes .gz (for example ….ndjson.gz).
S3 stores Content-Encoding: gzip.
Consumers must decompress before parsing unless the tool auto-detects gzip (many Athena and Spark setups do when Content-Encoding is set). NDJSON plus gzip is a common choice for cost-sensitive archival.
Set Custom endpoint to your vendor’s S3 API URL and provide access key credentials per that vendor’s documentation.
Store
Notes
AWS S3
Leave custom endpoint blank; use a bucket in the configured region
MinIO
Set endpoint to your MinIO server URL; use MinIO access keys
Cloudflare R2
Set endpoint to your R2 S3 API URL; use R2 access keys
Pangolin does not expose path-style vs virtual-hosted addressing, ACLs, SSE-KMS, storage class, or multipart tuning. Configure those in the vendor console or bucket policy.
Adjust bucket name and prefix to match your configuration. ListBucket is optional but useful when debugging missing objects.Block public access, encryption at rest, lifecycle rules, and object tags are configured in AWS or your vendor console, not in Pangolin.
The data object in each streamed event is the full stored log row. Field sets differ by log type. See the documentation for that log type under Logs & Analytics for the complete data shape.
No custom JSON shape: Fixed event record only. Use an HTTP destination if you need body templates or field remapping.
No per-event objects: Always batched (up to ~250 events per object).
No mixed log types in one object: Each upload contains a single log type.
Upload-time partitioning: Key date folders use upload time (UTC), not the event’s timestamp.
CSV columns: Automatic from batch contents; not user-selectable; column set may change over time.
Static credentials only: Rotate keys by updating the destination; credentials are stored encrypted server-side.
Historical logs: New destinations do not backfill.
Delivery errors: Check the destination’s last error in the dashboard. Common causes: AccessDenied, wrong bucket or region, bad endpoint URL, TLS issues, or expired credentials.
Missing objects: Confirm prefix, lifecycle rules, and that the log type is enabled on the Logs tab.
Athena/Glue parse errors: Verify format (JSON array vs NDJSON), gzip handling, and that the crawler/table schema matches flattened CSV columns if using CSV.