Skip to main content

Logging

Heimdall logs structured JSON to stdout via Serilog. There is also an optional audit log channel for filtering decisions.

Serilog​

The Serilog block at the top level of config.yml is read by UseSerilog(... ReadFrom.Configuration(ctx.Configuration)) in Program.cs. The default is:

Serilog:
MinimumLevel:
Default: "Information"
Override:
"Microsoft": "Warning"
"Heimdall.Audit": "Information"

Most settings supported by Serilog.Settings.Configuration work — minimum levels, per-source overrides, enrichers. The output is always JSON to console; that is wired in code, not configuration, because container log scraping expects a single, predictable stream.

Common operator changes:

  • Raise verbosity for one source while leaving the rest alone:

    Serilog:
    MinimumLevel:
    Default: "Information"
    Override:
    "Heimdall.Ecosystems.NuGet": "Debug"
  • Suppress noise from a specific component:

    Serilog:
    MinimumLevel:
    Override:
    "Microsoft.AspNetCore.HttpLogging": "Warning"

HEIMDALL_* environment variables also override Serilog config — useful for flipping debug logging in production without redeploying.

A structured entry is also emitted per HTTP request (method, path, status, elapsed); that behaviour is fixed in code and needs no configuration.

Audit log​

The audit log (source Heimdall.Audit) records filtering decisions — every version Heimdall served or denied, the feed it came from, and the reason attached to deny verdicts.

Toggle via configuration:

heimdall:
observability:
audit:
enabled: true # default

When disabled, no audit lines are emitted; the per-request log entries are unaffected.