📝 Logging

MidiEditor AI writes a runtime log so you can attach it to a bug report, post-mortem a session that didn't behave, or just see what the app is doing internally. The log is one plain text file (midieditor_ai.log) with sane defaults: most users never have to think about it.

Settings → Logging tab: five level radio buttons with colour-coded severity bars, sample-line preview pane, size-estimate warning callout, Open log file button, and the advanced per-category rules editor
Settings → Logging in v1.7.0: pick a level on the left, see exactly what gets written and how much disk it'll cost on the right.

This page covers what the log records, where to find it, how to turn it up while debugging, and how to keep it from filling your disk if you forget to turn it back down.


The four severities

CRI Critical / fatal WRN Warnings INF Info DBG Debug

Each line in the log is tagged with one of the four severities above, plus a category (e.g. midieditor.collab.lan) and a timestamp. The level you choose in Settings → Logging tells the app which severities to write to the file - the rest are silently dropped.


The five levels

Levels are cumulative: each higher level includes the lower ones. Info writes everything Warnings writes plus the info lines. The colored bar next to each radio in the settings dialog mirrors this on screen.

Off
No logging. The file stops growing entirely.
Errors only
Critical / fatal entries. Catches crashes, misses everything else.
Warnings default
+ recoverable issues, suspect state, network warnings.
Info (verbose)
+ lifecycle events: session start/stop, file load, sync ticks, traffic.
Debug (very verbose)
+ per-frame trace, every tool call, ICE candidates, raw frames.

What each level looks like

Errors only - only crash-class entries, nothing routine:

2026-05-09T13:42:18.331 CRI [midieditor.collab.rtc] DTLS handshake failed: cert expired 2026-05-09T13:42:19.011 CRI [midieditor.audio] FluidSynth load failed: insufficient memory

Warnings (default) - adds recoverable issues:

2026-05-09T13:42:18.331 CRI [midieditor.collab.rtc] DTLS handshake failed: cert expired 2026-05-09T13:42:21.108 WRN [midieditor.collab.lan] session: peer disconnected, remaining=2 2026-05-09T13:42:23.940 WRN [midieditor.midi] track 5 has overlapping NoteOn - clamped

Info - adds lifecycle events that show what the app is doing:

2026-05-09T13:42:21.108 WRN [midieditor.collab.lan] session: peer disconnected, remaining=2 2026-05-09T13:42:24.112 INF [midieditor.collab.lan] session: traffic peers=3 out=842 B/s in=18 B/s 2026-05-09T13:42:24.230 INF [midieditor.collab.lan] session: syncTick broadcast hunks=2 endTickChanged=false

Debug - adds per-frame / per-iteration trace lines:

2026-05-09T13:42:24.230 INF [midieditor.collab.lan] session: syncTick broadcast hunks=2 2026-05-09T13:42:24.240 DBG [midieditor.collab.diff] stacked events: 187 collisions across 12 keys 2026-05-09T13:42:24.241 DBG [midieditor.collab.rtc] local candidate: 192.168.0.164:51234 typ host 2026-05-09T13:42:24.242 DBG [midieditor.collab.rdv] pollJoinerOffers GET /code/AB12/joiner-offers

File size & performance trade-offs

Each level produces a different rate of writes per second. The list below is what to expect from a typical 30-minute session; your mileage varies with how busy your file is.

Off / Errors / Warnings - fine for everyday use. A few hundred lines at most per session, sub-megabyte files. The default Warnings setting is what you want unless you're actively debugging something.
Info - moderate growth, fine while reproducing an issue. Sync-tick summaries, session lifecycle, traffic counters. Roughly a few MB per hour of active editing. Switch back to Warnings when the bug report's filed.
Debug - large files, slight performance hit, use sparingly. Tens to hundreds of MB per hour. The app spends measurable time writing to disk; a busy collab session at Debug can shave a few ms off each sync tick. Only useful when you're chasing a specific deep-stack bug. Files rotate at 10 MB so total disk usage caps at ~40 MB (current + 3 backups), but each open of the log will be slower while at this level.

Where the file lives, and how rotation works

MidiEditor writes midieditor_ai.log next to the MidiEditorAI.exe - same folder as the binary, easy to grab and attach to an issue. The Open log file button in Settings → Logging opens it directly.

Rotation is in-flight, not just at startup: as soon as the active log hits 10 MB, the file is renamed and a fresh one starts. Up to three numbered backups are kept - .log.1, .log.2, .log.3 - oldest first to go. So total disk usage caps at four files × 10 MB = 40 MB regardless of how long the app runs.


Per-category overrides (advanced)

Underneath the level radios is a small text area for Qt's standard filter-rule syntax. One rule per line, applied after the level above (so per-category rules win). Example use cases:

midieditor.collab.diff=true # turn one category up to Debug… midieditor.collab.rtc.*.debug=false # …while silencing rtc-only debug qt.network.ssl.*=false # silence all of Qt's SSL chatter

You'll rarely need this. The two common situations:


When to attach the log to an issue

  1. Open Settings → Logging, raise the level to Info (or Debug for a really specific bug), close.
  2. Reproduce the issue.
  3. Hit Open log file; the file opens in your default text editor / file viewer.
  4. Attach (or paste) the relevant section to the GitHub issue. The bigger the file, the more context, but also the bigger the upload - trim around the timestamps that match what you reproduced.
  5. Switch the level back to Warnings so the file doesn't keep growing.

Logs never leave your machine on their own - the app doesn't phone home. Only sharing them via a GitHub issue (or a paste-bin link) sends them anywhere.