Skip to main content

Audit Logs

The Logs page (/logs) combines immutable audit history with live operational logs for incident response and governance.

Audit trail

The audit tab records every state-changing action in the system. Each entry is immutable and timestamped.

Audit event structure

{
"id": "evt_a1b2c3d4",
"timestamp": "2026-02-21T14:32:10Z",
"actor": {
"type": "user",
"id": "usr_abc123",
"email": "alice@acme.com"
},
"action": "model.version.published",
"resource": {
"type": "model_version",
"id": "mv_xyz789",
"name": "classifier-v2.1.0"
},
"result": "success",
"metadata": {
"previous_version": "2.0.0",
"rollout_percentage": 10,
"ip_address": "203.0.113.42"
}
}

Filtering

Filter the audit feed by:

FilterDescriptionExample
ActorUser, API key, or systemalice@acme.com
ActionEvent typemodel.deployed, device.registered, round.completed
ResourceResource type or IDmodel_version, mv_xyz789
ResultSuccess or failurefailure
Time windowDate rangeLast 24 hours, last 7 days, custom range

Common audit actions

ActionDescription
model.version.createdNew model version uploaded
model.version.publishedVersion marked as available
model.deployedRollout started
model.rollbackVersion rolled back
round.startedTraining round initiated
round.completedTraining round finished
device.registeredNew device registered
device.revokedDevice token revoked
api_key.createdNew API key generated
api_key.revokedAPI key revoked
privacy.config.updatedPrivacy settings changed

Operational logs

The operational tab shows live server logs for debugging.

Fields

  • Service — which server component emitted the log
  • Leveldebug, info, warning, error
  • Request ID — correlates logs from a single API request
  • Trace ID — correlates logs across distributed components
  • Message — log content and structured payload

Investigating an incident

  1. Filter by level: error and the relevant time window.
  2. Copy the request ID from the error log.
  3. Filter by that request ID to see the full request lifecycle.
  4. Check the audit tab for the corresponding state change (or lack thereof).

Data export

Export audit logs as CSV

Click Export > CSV in the audit tab. The export includes all events matching your current filters.

Export operational logs as JSON

Click Export > JSON in the operational tab. Each line is a JSON object for easy ingestion into external SIEM tools (Splunk, Datadog, Elastic).

API export

Export audit events for the last 7 days:

curl "https://api.octomil.com/api/v1/audit/export?from=2026-02-14&to=2026-02-21&format=csv" \
-H "Authorization: Bearer edg_..." \
-o audit-export.csv

Export operational logs:

curl "https://api.octomil.com/api/v1/logs/export?level=error&from=2026-02-20&format=json" \
-H "Authorization: Bearer edg_..." \
-o error-logs.json

Real-time log streaming

For continuous log export (not just one-time downloads), configure log integrations in Settings > Log exports or via the CLI/SDK:

DestinationIntegration typeFormat
Splunk HECsplunkhec
Elasticsearchelasticsearchjson
Datadogdatadogjson
CloudWatchcloudwatchjson
OTLP Collectorotlpotlp
Custom webhookwebhookjson or syslog

The easiest way to get started is the unified OTLP collector:

octomil integrations connect-otlp --endpoint http://otel-collector:4318

This configures both metrics and log export in one step. See Export Metrics for details.

Compliance and retention

Audit retention policy is configured in Workspace Settings:

PresetRetention periodUse case
Default90 daysStandard operations
HIPAA6 yearsHealthcare compliance
GDPRPer data subject requestEU data privacy
SOC 21 yearSecurity audits

Audit events are stored immutably — they cannot be edited or deleted within the retention window. After the retention period expires, events are purged automatically.