Log Levels
The levels
Section titled “The levels”Each carries a numeric value, and minimumLevel keeps everything at or above it.
| Level | Value | Shorthand | Use for |
|---|---|---|---|
all | 0 | none | A threshold only. Keeps everything. |
system | 500 | none | CodeScout’s own record of something it did to this device. |
verbose | 1000 | .v() | Granular tracing, variable dumps, loop detail. |
debug | 2000 | .d() | Development detail, state changes, widget builds. |
info | 3000 | .i() | User actions, milestones, successful operations. |
warning | 4000 | .w() | Handled but unexpected: retries, fallbacks, slow responses. |
error | 5000 | .e() | Caught exceptions, failed requests, operations that did not complete. |
fatal | 6000 | .f() | Unrecoverable. The app cannot carry on from here. |
off | 10000 | none | A threshold only. Keeps nothing. |
The threshold
Section titled “The threshold”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.
In the console
Section titled “In the console”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.
On the wire
Section titled “On the wire”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.