Skip to content

Logs and monitoring

Silo is in active development before 1.0. These guides are updated frequently.

Use Admin > Logs > Server Log for searchable server logs. Use the container logs when Silo fails before the web app is available.

From the directory that holds your Compose file:

Terminal window
docker compose logs --tail 100 --timestamps silo

Add --follow to watch new lines while you reproduce a problem. Press Ctrl+C to stop watching; Silo keeps running.

In Admin > Logs > Server Log, search around the time of the failure by message, component, request ID, or playback session ID. On the Application tab, narrow the list with Level and Component.

  • Level shows only entries at the level you pick: debug, info, warn, or error. Picking warn doesn’t include errors. All levels removes the filter. debug entries appear only if they’re enabled with opslog.capture_level, which is off by default; see Log settings.
  • Component suggests known components as you type, and accepts any other name, such as apiv2 or notifications.fanout. The name has to match exactly, so notifications doesn’t show notifications.fanout entries. Clear the field to show every component.

Both filters apply to the live list and to Browse log history. They’re kept in the page address, so a reload or a shared link opens with the same filters.

Early database and migration messages can appear only in the container logs, because Silo writes them before the admin log starts collecting.

The Audit tab in Admin > Logs > Server Log lists nearly every request to your server, including page loads and failed sign-ins: who made each one under Actor, when, and the status code. Changes an administrator makes to accounts and access groups also show what changed under Action / changes and which account or group under Target. Other requests show HTTP request.

  • Narrow the list by action, such as user.updated or access_group.updated, by actor account ID, or by target type and ID.
  • Choose Browse log history to page through older entries with Older and Newer.
  • If the live list disconnects, choose Reconnect, then check history for anything that arrived in between.

Changed fields show their old and new values, and permission changes list the permissions before and after. A password change shows only that the password changed.

If an administrator acted as another account, Actor shows both, for example #1 (as #7), where #1 is the administrator. Filtering by actor finds the administrator, not the account they acted as. The filters are kept in the page address, so a shared link shows the account IDs you filtered by.

A Status of 499 means the client closed the connection before Silo finished answering, for example when someone leaves a page while it loads. Silo doesn’t send it; it only records it. A server error that happens after the client has left is recorded as 499 too, so check the Application tab around the same time for the cause.

On Admin > Logs > Settings, under Server log:

SettingEffectTakes effect
Log levelLowest level written to the container log and to OpenTelemetry exportImmediately
Quiet log prefixes (under Advanced)Drops lines that start with any of these wordsImmediately

Set Log level to Debug only while you collect a short sample, then set it back.

Admin > Logs > Server Log has its own threshold and keeps Info and above by default, so Debug doesn’t add lines there. Two stored settings have no control in the web app. You can change them through the admin API, and both need a restart:

  • opslog.capture_level: the lowest level kept in Admin > Logs > Server Log (debug, info, warn, or error)
  • server.log_format: text or json in the container log

Silo masks structured fields with secret-like names, such as passwords, tokens, authorization headers, and cookies. It cannot recognize every secret inside free-form message text.

Read an excerpt before sharing it. Remove account details, private paths or titles, and credentials. Plugin output needs the same review. Report a problem explains what to include.

Set how long the Application tab keeps entries on Admin > Logs > Settings, under Log retention: Delete log entries older than and Maximum log size, and Maximum log entries under Advanced. The Audit tab keeps entries for 90 days.

Docker keeps container logs separately. For Docker’s json-file driver, a Compose override can cap them:

services:
silo:
logging:
driver: json-file
options:
max-size: "50m"
max-file: "5"

Add this to your existing override if you have one. Applying it recreates the container, which interrupts playback.

To collect Prometheus metrics and alerts, see Monitor Silo with Prometheus. Read node status lists the proxy and transcode node series and example alerts. For health and readiness checks, see Check server health.

To send logs and traces to an existing OpenTelemetry collector, add its endpoint and protocol to .env, then recreate the container with docker compose up -d:

OTEL_EXPORTER_OTLP_ENDPOINT=https://collector.example.com
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf

Replace the example with your collector’s address and configure the authentication and certificates it needs. Setting OTEL_EXPORTER_OTLP_ENDPOINT turns export on. Setting only the per-signal endpoint variables does not; set SILO_OTEL_ENABLED=true in that case. Inside Docker, localhost does not reach a collector in another container, so use a hostname the Silo container can reach.

Export is best effort. If the collector fails, requests, the container log, and Admin > Logs > Server Log keep working, but buffered export data can be lost. Keep history you need at the collector. With metrics turned on, silo_otel_export_records_total{outcome="error"} counts failed exports.

Silo sends traces for 1% of requests by default. To change that, set the ratio in .env and recreate the container:

OTEL_TRACES_SAMPLER_ARG=0.1

OTEL_TRACES_SAMPLER_ARG is a number from 0 to 1, and the default is 0.01. Use 1 (every request) only while you investigate a specific problem, then set it back.

OTEL_TRACES_SAMPLER chooses how Silo samples: always_on, always_off, traceidratio, parentbased_always_on, parentbased_always_off, or parentbased_traceidratio. The default is parentbased_traceidratio, and Silo uses it for any value it doesn’t support.