Tune Mitra's log verbosity with MITRA_LOG_LEVEL to diagnose problems — and understand what each level shows.
Mitra logs to stdout, so docker logs / docker compose logs shows everything. A healthy server is quiet by design — at the default level it prints only lifecycle milestones. Turn the verbosity up when you need to diagnose something.
docker compose logs -f mitraSetting the level
Section titled “Setting the level”Set MITRA_LOG_LEVEL in your environment:
environment: MITRA_LOG_LEVEL: 'debug'Each level includes everything quieter than it:
MITRA_LOG_LEVEL | What you get |
|---|---|
error | Failures only. |
warn | …plus handled degradations (an undelivered push, a geocoder timeout, a failed OIDC discovery). |
info (default) | …plus lifecycle milestones — the healthy-server heartbeat (boot, sign-ins, connected integrations, remote changes pulled, reminders firing). |
debug | …plus every request (method /path → status (ms)), each sync tick, sync pace transitions (a client connecting or disconnecting switches that user’s polling between fast and relaxed), session events, entry edits, and CalDAV round-trips. |
trace | …plus the firehose: SQL and raw .ics payloads. |
At boot, Mitra prints the active level so you know what you’re looking at.
NOTE
Secrets are never logged, at any level — passwords, tokens, and PKCE verifiers are always kept out of the output. debug and trace are safe to share for troubleshooting in that respect, though they may reveal entry titles, paths, and calendar data.
Which level to use
Section titled “Which level to use”- Something isn’t syncing?
debugshows each sync tick, when polling switches between its fast (app open) and relaxed (nobody connected) pace, and the CalDAV/Notion round-trips. - Reminders not arriving?
infoalready logs each reminder as it fires;debugshows the delivery attempts and any pruned subscriptions. - A 500 error?
errorlogs it with a stack trace; the defaultinfoincludeserroralready. - Deep protocol debugging?
tracedumps SQL and the raw.icspayloads — verbose, use briefly.
Return to info (or unset the variable) once you’re done — debug/trace are chatty by design.