Skip to main content
Audit logging is available in Onyx v4.3 and later, on self-hosted deployments where you control the log pipeline.

Overview

Onyx emits a normalized, structured audit-event stream for security-relevant actions — authentication, user and access-control changes, admin configuration changes, and credential access. Every event is a single JSON object, so you can forward the stream to any SIEM — Splunk, Microsoft Sentinel, Elastic, Google Chronicle, AWS Security Lake — with no Onyx-side integration to build. You point your log shipper at Onyx’s logs, filter the audit stream, and parse the JSON. Field names and the action taxonomy are shaped toward OCSF (the Open Cybersecurity Schema Framework), so events map cleanly onto the event classes most SIEMs already understand. This maps directly onto common compliance controls — SOC 2 CC7 and the NIST 800-53 / FedRAMP AU family (AU-2 auditable events, AU-3 record content, AU-6 review, AU-12 generation).

What gets captured

Login success, login failure, logout, registration, password forgot, password reset, and email verification.
User creation (admin invites), deletion, deactivation, reactivation, role changes, and user-group membership changes.
Create / update / delete of LLM providers, connectors, connector-credential pairs, API keys, and credentials — plus credential-access (decrypt) events.
Each event records who did what, to which resource, when, from where, and whether it succeeded — the core of an audit trail.

How it works

Audit events are emitted as INFO log records on a dedicated onyx.audit logger. The message body of each record is a single JSON object — Onyx serializes the event itself, so the audit line is identical regardless of your log format. Emission is fail-safe: it never interrupts a user request or a connector run, even if context gathering or logging fails. High-volume event classes are de-duplicated within a short (10-minute) window using Redis. De-duplication is fail-open — if Redis is unavailable, the dedup check is skipped and the event is still emitted, so an audit event is never silently dropped due to infrastructure trouble (you may just see a duplicate). The subsystem is always on — there is no enable/disable flag, output-format, or destination setting, and the de-duplication window is fixed. The only related knob is LOG_FORMAT (below), which shapes the surrounding log records; the audit JSON body itself is identical either way.
Run Onyx with LOG_FORMAT=json so that all log records — not just audit events — are machine-parseable, and request/tenant context is promoted to top-level fields. This makes filtering and parsing in your shipper much simpler.

Event schema

The action values are a stable, append-only contract — safe to filter and build dashboards against. New actions may be added over time; existing ones do not change meaning.

Example event

Forward to your SIEM

Because audit events are just JSON log lines on a known logger prefix, any log shipper works.
1

Run Onyx with JSON logging

Set LOG_FORMAT=json so every log record is structured and carries a logger and message field.
2

Ship Onyx's logs

Point Fluent Bit, Vector, the CloudWatch agent, Filebeat, or your existing collector at the Onyx container stdout (or the mounted log files).
3

Isolate and parse the audit stream

Keep only records whose logger starts with onyx.audit, then parse each record’s message field as JSON to recover the event fields above.
4

Route to your SIEM

Send the parsed events to your SIEM’s ingest endpoint. The OCSF-shaped fields map onto Authentication, Account Change, and API Activity event classes.

Shipper examples

Filter on the onyx.audit prefix to capture everything. The stream is also split into per-class child loggers — onyx.audit.authentication, onyx.audit.account_change, onyx.audit.api_activity, and onyx.audit.credential_access — if you want to route classes to different destinations.

Event reference

Every action value, what triggers it, and the fields most useful for building SIEM detection rules. actor, tenant_id, request_id, endpoint, source_ip, and outcome are present on every event (see Event schema) and are omitted from the tables below.

Authentication

ocsf_class: authentication

User & access management

ocsf_class: account_changeresource_type is user (or user_group).

Configuration & resources

ocsf_class: api_activity

Credential access

onyx.audit.credential_access Credential-decrypt events predate the generalized schema and are emitted on a flat, legacy field set for backward compatibility. They share the onyx.audit logger tree and the same fail-safe / fail-open behavior, but do not carry the generalized fields — there is no action, ocsf_class, outcome, resource_type/resource_id, extra, or nested actor object, and the client IP is client_ip (not source_ip). Parse this stream separately; detection rules written against the generalized schema will not match it.
The taxonomy is append-only: new action values may be added in future releases, but existing ones never change meaning — so detection rules and dashboards built against these values keep working across upgrades.

Notes

  • Secrets are never logged. Actor objects and extra context are scrubbed of credential values by design.
  • Credential-access events (onyx.audit.credential_access) use a separate, flat field set than the generalized schema for backward compatibility — see Credential access for the full field list. They share the same logger tree and fail-safe behavior.
  • For Onyx Cloud (multi-tenant) deployments, audit-log forwarding is handled differently since you don’t control the log pipeline — contact us to discuss SIEM delivery options.