Skip to content

Log Levels

Each carries a numeric value, and minimumLevel keeps everything at or above it.

LevelValueShorthandUse for
all0noneA threshold only. Keeps everything.
system500noneCodeScout’s own record of something it did to this device.
verbose1000.v()Granular tracing, variable dumps, loop detail.
debug2000.d()Development detail, state changes, widget builds.
info3000.i()User actions, milestones, successful operations.
warning4000.w()Handled but unexpected: retries, fallbacks, slow responses.
error5000.e()Caught exceptions, failed requests, operations that did not complete.
fatal6000.f()Unrecoverable. The app cannot carry on from here.
off10000noneA threshold only. Keeps nothing.
LoggingBehavior(minimumLevel: LogLevel.warning)

That keeps warning, error and fatal. Everything quieter is discarded the moment it is logged, before four separate things: your console, the in-app panel, the phone’s SQLite database, and anything uploaded. A level you switch off is not hidden, it is never recorded.

In production, reach for the sample rate rather than the level. Raising minimumLevel to info also switches off network capture, because requests and responses are logged at debug, so an app that wants quiet logs and still wants its HTTP calls keeps debug and turns sessionSampleRate down instead. See Controlling Volume.

With printToConsole on, each log is printed between two divider lines, with the time, the level and the message on the first:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[10:30:00.123] [ℹ️ INFO] User signed in
🏷️ Tags: auth
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

A request id, metadata, an error, tags and a stack trace each get a line of their own when the log carries one. Network calls print their request id too, followed by the method, the URL, the status, the headers and the body in place of the metadata, error and tags lines. A failed call adds the error’s type and message.

Every level prints in its own ANSI colour, with a name and an emoji. That includes verbose, fatal and system, so a fatal reads [💀 FATAL]. The dashboard also colours levels and is the easier place to scan a long list.

The level travels as its lower-case name:

{"level": "info", "message": "User signed in", "timestamp": "2026-01-15T10:30:00Z"}

Valid values: system, verbose, debug, info, warning, error, fatal.