Skip to content

Log analysis

Enable the Log panel from App, select the App or Device source, and choose Analyze. The analyzer examines buffered entries for that source and active protocol, including captured levels hidden by the level toggles. It does not read the entire log file or actively test a radio connection.

Each finding shows a count and latest message. Expand View evidence for the newest 20 matching entries with timestamps, levels, and sources. The recommendations below the findings explain what to check. Copy troubleshooting report creates a plain-text summary with UTC timestamps, guidance, and up to three samples per finding. The copy happens only after clicking the button. Log samples can contain private information; review them before sharing. Log → Export and App → Support / Bug reports → Export for GitHub provide the fuller context when needed.

Findings describe historical events, not necessarily ongoing failures. One line may match several categories, so category counts are not a count of unique incidents. Other warnings and errors retains unmatched warning/error lines without inventing a diagnosis; expected recovery messages can appear there. Cancelled page loads (ERR_ABORTED) remain excluded from findings.

Review of current logging

Issue #915 prompted an inventory of TypeScript log calls and Rust sidecar warning/error emitters, followed by a comparison with the existing patterns and the sidecar forwarding code. The review found that the recommendation resolver was ignoring the category recommendation map, causing specific failures to display generic internal-error advice. USB serial also lacked a recommendation. Both are now covered by map-completeness tests.

Log family Analysis coverage and decision
BLE, handshake, pairing, notify watchdogs Retain existing transport patterns and noise exclusions. Device information showing state=disconnected is not itself a connection failure.
MQTT, retries, Meshtastic/MeshCore SDKs Retain specific network/retry patterns and level-gated SDK categories. Generic “connection refused” alone does not identify an MQTT broker.
TCP and USB serial Add Meshtastic TCP connect/write failures alongside MeshCore TCP. Restore actionable serial-reconnect guidance.
Database initialization, migrations, permissions Retain existing checks. Separately identify [dbPersistRetry] degraded persistence when retries exhaust or the write queue drops data; warn that visible state may not survive restart.
App crashes and UI stalls Retain process/load failures; add renderer heartbeat stalls and Electron unresponsive events from rendererHeartbeatWatchdog.ts. Recovery messages are not new hang findings.
Reticulum service Recognize watchdog health failures/restarts, failed start/stop, event/voice WebSocket errors, and failed runtime restarts. Avoid classifying every [ReticulumSidecar] warning as an outage.
Reticulum delivery and propagation Recognize terminal LXMF delivery/path-budget failures and failed propagation sync. Reticulum decrypt failures receive delivery guidance rather than LoRa channel-key advice. Stored-at-PN progress and normal packet reception are not delivery failures.
Reticulum pressure and dropped events Recognize bounded-channel saturation, WebSocket subscriber lag, payload cap drops, and failed path-request enqueue. Recommend checking actual message status before retrying.
Firmware flashing Recognize the ESP32/nRF52 flasher stall messages that close the serial port.
Nomad hosting, TAK server, remote TAK relay, updater, Store & Forward Retain existing dedicated patterns and guidance.
Other UI, storage, remote/RRC, voice, games, and configuration logs Keep unmatched warnings/errors available as evidence. A module prefix alone is insufficient to diagnose corruption, unreachable peers, or a broken service. Existing specialized panels and debug snapshots supply richer state.

Maintaining patterns

The pure analyzer lives in src/renderer/lib/logAnalyzer.ts. Add a specific emitter-backed failure pattern and a harmless counterexample in logAnalyzer.currentLogs.test.ts. Add static label and recommendation keys in logAnalyzerI18n.ts plus English strings; run the normal translation workflow. logAnalyzerI18n.test.ts checks that every category label has specific, resolvable advice.

Reticulum forwards some informational Rust tracing messages through the warning console channel for support visibility. Do not add broad prefix-only rules for it. Inspect reticulum-sidecar-manager.ts and the original Rust emitter before inferring failure from the captured level. Preserve protocol gating and cancellation exclusions, and do not infer recovery or current health without evidence.