Skip to main content
Upcoming release — Zylon 1.58These docs are published ahead of release so you can prepare your API integrations. The release image is not yet available. For installations running 1.57, use the 1.57 documentation.

Overview

Zylon supports internal log storage and external log delivery through syslog and HTTP.
  • Syslog delivery is intended for SIEM applications and log collectors that accept syslog or CEF events.
  • HTTP delivery is intended for structured ingestion endpoints, cloud log destinations, and customer-managed collection pipelines.
  • Delivery is asynchronous.
  • With failurePolicy: "drop", delivery is designed to stay off the critical request path when queues are full.
  • Delivered events can be filtered by action patterns and organization IDs.
  • Stored logs stay in the customer’s Zylon deployment unless external log delivery through syslog or HTTP is enabled.
For CLI-managed installations, edit /etc/zylon/zylon-conf.yaml and run sudo zylon-cli sync to apply changes. For installations managed directly with Helm, use the same keys in your Zylon Helm values YAML. The chart maps these values to backend runtime settings internally. For governance, auditability, EU AI Act traceability support, evidence preservation, and retention guidance, see Auditability & AI Governance: Logging, Evidence, and SIEM Delivery. For manual log retrieval, see Backoffice API: Logging.

Send logs to your SIEM

For a custom SIEM with an HTTPS JSON ingestion endpoint, start with HTTP delivery below. If your collector accepts syslog or CEF, use the syslog configuration instead. Internal storage (logging.storage.enabled) is enabled by default. External syslog and HTTP delivery are disabled by default. Enabling storage alone does not send events to your SIEM. Delivery forwards newly emitted events; it does not automatically replay stored history. Use the Backoffice Logging API to retrieve historical records.

1. Prepare your collector

Create an HTTPS endpoint reachable from the Zylon backend that accepts POST requests with JSON log records. Return an HTTP 2xx response after accepting a request. If your endpoint requires bearer authentication, prepare its ingestion token. The HTTP payload uses the schema marker zylon.canonical_json.v1. A single-event request contains a JSON object; multi-event batches contain a JSON array. The example below sets maxEvents: 1 so you can validate one record at a time. To use the default batch size of 25 later, make sure your collector also accepts arrays. The HTTP envelope contains schema, severity, outcome, actor, and log. Map log.event, log.action, log.id, and log.start_timestamp to your SIEM fields. These fields are nested under log, rather than at the top level. Deduplicate retries using log.id.
Actor selection uses the first matching row:For token/user actors, actor_display is the nonblank log.account_email, falling back to the selected actor ID. System/unknown actors use their literal value for display too. A workspace-member ID or email alone does not select user; token/account identity takes precedence over system_event.Use log.account_id for account correlation and log.ws_member_id for workspace-member correlation, when available. A user actor ID can identify either record type; do not treat it as an account ID in every event. actor_display is a display label, not a stable join key.If an action has no specific severity mapping, successful Backoffice events default to medium and other successful events to low; failed Backoffice events default to high and other failures to medium. An unknown actor does not imply an unknown outcome or change severity.
Validate your parser with a received test event. Optional fields can be absent, and action is not present on every event. With batching enabled, accept both a single object and an array, depending on the number of events ready to send.
Gateway chat request-message and response capture (features.audit.enabled) is enabled by default. Forwarded records can contain that captured chat content. Review Audit Log configuration before enabling delivery. The API’s include parameter does not filter forwarded records.

2. Configure Zylon

Merge this example into /etc/zylon/zylon-conf.yaml, preserving your existing settings. Replace the URL and token with your collector’s values; the token belongs to your SIEM, not to the Zylon Backoffice API. If your collector does not require bearer authentication, omit the auth block.
Leave action and organization filters empty for the first test so they do not exclude the event you generate. Keep the queue, retry, and failure-policy defaults unless your collector needs different behavior. See HTTP delivery for the complete reference.

3. Apply the configuration

For deployments managed directly with Helm, apply the values through your normal Helm deployment process. See Configuration Overview for the CLI workflow.

4. Verify a new event

After applying the configuration, create a test project in the Workspace. Inspect the incoming request at your collector and confirm the schema marker zylon.canonical_json.v1 and log.action: "ws.project.create" are present. Then confirm the record appears in your SIEM’s search or event view. If the event does not arrive, check backend delivery warnings, endpoint reachability, collector responses, authentication, and filters. HTTP 4xx responses are not retried; fix the collector URL, authentication, headers, or parser before repeating the test. Use Troubleshooting below for other symptoms.
The default failurePolicy: "drop" can drop events when the delivery queue is full. External delivery has no disk-backed spool. Keep internal storage enabled for investigation and verify your collector’s retention separately.

5. Choose internal and SIEM retention

Stored-log cleanup is disabled by default: logs are not automatically deleted after 180 days. To enable scheduled deletion, use Log-only cleanup. Configure retention for copies in your SIEM separately.

At a glance

Syslog and HTTP delivery can be enabled at the same time. When both are enabled, Zylon dispatches matching logs to both destinations. Filters, failure policy, queue, and batch settings are configured separately for each delivery method but follow the same behavior.

Before you configure delivery

  • Confirm the collector endpoint is reachable from the Zylon backend.
  • Confirm host or URL and port.
  • Select transport and format.
  • Decide TLS certificate verification behavior.
  • Configure collector-side input, index, parser, or ingestion route.
  • Understand retention requirements in both Zylon and downstream systems.
  • Review filters so required audit events are not excluded.

Choose a delivery channel

Storage and retention

Internal log storage is controlled under logging.storage.

Storage keys

Retention keys

Internal log cleanup is controlled by the cleanup scheduler under zylonBackend.scheduler.cleanup. Scheduler settings: Under logging:
External collectors such as SIEM platforms, syslog receivers, HTTP collectors, and data lakes have independent retention settings.
Stored log cleanup is off by default. The 180 day value applies only after both the cleanup scheduler and stored log cleanup are enabled.
Log retention cleanup uses the same cleanup cron and timezone settings as hard delete cleanup. Review Hard delete cron configuration before changing the shared cleanup schedule.

Configure cleanup for stored logs only

Merge this example into your configuration only when you want to enable internal log deletion. It schedules daily checks at 03:00 UTC with a 180-day retention window:
Both cleanup.enabled and cleanup.logging.enabled must be true. Setting workspace.enabled: false keeps Workspace hard deletion disabled in this example; the Helm default is true, so review this flag before enabling the shared scheduler. Preserve your existing Workspace cleanup policy if you already use it. After applying the configuration with sudo zylon-cli sync, each scheduled run permanently deletes records persisted more than 180 days earlier, including their related log details. Age uses the stored record’s created_at timestamp, assigned when new logs are persisted. Historical records migrated from older versions may use their event start time. Eligible records remain until a successful cleanup run. Cleanup applies across all organizations and log families; external delivery filters do not limit deletion. To stop log cleanup, set zylonBackend.scheduler.cleanup.logging.enabled: false. Disabling logging.storage.enabled stops new persistence; it does not erase existing records. Cleanup does not delete copies already sent to your SIEM or change its retention policy.
Use a positive whole number for cleanup.logging.deleteAfterDays. 0 does not mean unlimited retention: it makes existing logs eligible for deletion. Negative values can also delete recent records. Disable cleanup with its enabled flag instead.

Syslog delivery

Syslog delivery sends formatted log records to a socket collector over TCP, TLS, or UDP. Use rfc5424_json for structured syslog pipelines. Use cef when the collector has a native CEF input.
UDP is best-effort. It does not use stream framing and does not retry the current batch on write failure.

Supported syslog matrix

Backend tests confirm both syslog formats with tcp, tls, and udp.

Syslog keys

Under logging.delivery.syslog:
Optional filter, delivery, queue, batch, and TLS settings are configured under their matching nested blocks in logging.delivery.syslog.Under filters:Under delivery:Under delivery.reconnect:Under delivery.queue:Under delivery.batch:Under tls:

Syslog full example

The full example limits delivery to matching Workspace and Backoffice actions in one organization. Remove or revise those filters if you also need security events or gateway events without an action or organization ID.

Syslog simplified example

HTTP delivery

HTTP delivery sends structured JSON records to an HTTP collector. Use it for ingestion gateways, data lakes, or pipelines that transform Zylon’s canonical payload downstream. The supported HTTP format is canonical_json. The schema value is zylon.canonical_json.v1. HTTP supports POST, optional bearer authentication, static headers using Header=Value or Header: Value, retries for network errors and HTTP 5xx responses, and no retry for HTTP 4xx client errors. Vendor-specific transformations should happen at the collector or ingestion layer.

HTTP keys

Under logging.delivery.http:
Optional authentication, filter, delivery, queue, and batch settings are configured under their matching nested blocks in logging.delivery.http.Under auth:Under filters:Under delivery:Under delivery.retry:Under delivery.queue:Under delivery.batch:

HTTP full example

HTTP simplified example

Filtering delivered events

Syslog and HTTP delivery use the same filter behavior under filters. Evaluation order:
  1. Exclude action patterns.
  2. Include action patterns.
  3. Included organization IDs.

Delivery behavior

The delivery pipeline is:
  1. Zylon emits a structured log event.
  2. Delivery filters decide whether to deliver it externally.
  3. The event is normalized with severity, outcome, and actor metadata.
  4. The event is formatted as syslog, CEF, or canonical JSON.
  5. The formatted payload is placed on the async delivery queue.
  6. The delivery worker sends the event to the configured destination.
  7. Reconnect or retry behavior applies when delivery fails.

Operational controls

Keep all Zylon backend nodes synchronized to a trusted time source such as NTP. The Helm chart sets the cleanup scheduler timezone to UTC by default; if the runtime setting is omitted outside Helm, the backend uses the server JVM time zone. Log records should be reviewed in UTC for cross-system forensic correlation. Treat changes to logging.storage, logging.delivery, filters, retention, and collector destinations as auditable deployment changes. Capture approvals and diffs in GitOps, change management, Kubernetes audit logs, or the infrastructure audit system used by the customer. Delivered payload schemas use markers such as zylon.rfc5424_json.v1 and zylon.canonical_json.v1. SIEM parsers should route by schema marker and validate parser compatibility during upgrades.

Failure policies

failurePolicy: "block" can slow requests when the delivery queue is full. Use it only after sizing queues and confirming collector availability.
These policies control queue backpressure only. block does not guarantee delivery: failed batches can still be discarded after non-retryable responses or exhausted retries. Disk-backed external delivery spooling and automatic replay from internal storage are not implemented.

Queue and batching

For syslog over UDP, the maxEvents value under delivery.batch is forced to 1, because one datagram carries one event. For HTTP, multi-event batches are delivered as a JSON array.
Queue and batching settings already have production defaults. If your HTTP destination, SIEM, or log collector does not require specific values, leave the defaults unchanged. Customize them only when your environment needs different throughput, latency, or burst handling.

Reconnect and retry

Syslog reconnect

TCP and TLS syslog delivery lazily opens a socket, reuses it, and retries the current batch once on a fresh connection after write failure. If retry fails, the reconnect backoff window applies.

HTTP retry

HTTP delivery reuses one HTTP client and retries failed requests according to retry settings. HTTP retries network exceptions and HTTP 5xx responses. HTTP 4xx responses, including 429, are not retried. After a non-retryable failure or exhausted retries, the failed batch is discarded and a delivery warning is logged; it is not automatically recovered from internal storage.

TLS configuration

Local or lab deployments may disable certificate verification. Production deployments should enable certificate verification when the collector has a trusted certificate path. Use caFile under tls when the collector uses a private CA.

Local validation

  1. Enable one delivery channel.
  2. Apply configuration.
  3. Trigger an API action that emits a log, such as project creation or API token creation.
  4. Query the collector.
  5. Confirm the expected event, action, log.id, and actor fields appear.
  6. Check backend logs for delivery warnings.
Validation queries depend on your collector. Use whichever search or inspection tool your destination provides, then confirm one of these payload markers appears:
  • zylon.rfc5424_json.v1 for RFC 5424 JSON syslog payloads.
  • CEF:0|Zylon for CEF payloads.
  • zylon.canonical_json.v1 for HTTP payloads.
  • A known action such as ws.project.create.
For reconnect testing, stop the collector, trigger events, restart the collector, then confirm new events arrive after the reconnect backoff.

Troubleshooting

For syslog and SIEM:
  • Prefer TLS where supported.
  • Prefer rfc5424_json for structured syslog ingestion unless the collector requires CEF.
  • Use octet_counting or newline according to the collector input.
  • Enable certificate verification in production where possible.
  • Keep failurePolicy: "drop" unless strict delivery completeness is more important than request latency.
  • Keep queue and batch defaults unless your destination requires different throughput, latency, or burst handling.
  • Keep stored log retention at or above 180 days unless legal, security, and operations teams approve a shorter period.
For HTTP:
  • Use canonical_json.
  • Keep vendor-specific transformations at the ingestion layer.
  • Use bearer authentication and static headers when required by the collector.
  • Tune retry settings for the collector’s availability profile.
  • Confirm downstream retention in the customer-controlled collector.