RobotDx › Reports › Activity log: one stream, two channels. Published copy, redacted. Taken out: 9 home paths, 5 hostnames, 32 serials, 1 vault paths, 12 screenshots with serials and machine names covered. Evidence for D18, D19. Written for Zach at the time, so it says “you”.

Activity log: one stream, two channels

Research and recommendation for RobotDiagnostics' Activity view, modelled on rqt_console · 2026-10-23 · Claude Code (Opus 5.5), scribe lane · repo ~/io-diagnostics · vault note: a private note

The answer

  1. Yes, one log. The Activity view becomes the device's single event stream on one clock: plugs and kernel port events, status transitions, the fault lifecycle, action runs and producers' own events. It uses rqt_console's columns and its exclude and highlight filters.20,21 Status reports and measurements stay out. They are the tree and the health bar, and only a change of level is an event. That is what AUTOSAR's fault memory did when it fed the log, and the opposite of ROS diagnostic_updater's verbose mode, which warns on every period.39,26
  2. Make the Event record the log record, not the status. Keep DiagnosticStatus, because it is state. Align Event to ROS rcl_interfaces/Log levels and to OpenTelemetry's LogRecord, and give it the stock projection to_ros_log() / from_ros_log() beside to_diagnostic_status().22,35,12 The additions are received, the debug and fatal severities, and a count for coalesced repeats.
  3. The fault memory is a read model of the same history. It stays the current state, shown on the entity and on the chip. Its lifecycle rows sit in the log, folded onto the event that caused them, so one fact is one row. Today 13:34:07 and 18:11:44 each show twice.17 A fault's detail shows "breadcrumbs": that entity's log for the 30 s before it.66,27
  4. Entity scope means the entity and its children, plus an optional path to the host. Every entity gets a Raw channel: its kernel lines, its driver's own output, and later /rosout by logger name. Raw is off by default, like Windows' Analytic and Debug channels.34,28,38,42
  5. It is the device's log, not a journal viewer. In 44 h this PC's journal wrote 56,573 lines, and 226 of them are kernel lines about USB (0.4 %). The Activity log carries coded events only. The raw journal is one click away as the exact journalctl command for that entity.19 The host should also keep its own events on disk, because the fault memory lives only in RAM and today's 15:00 reboot wiped it.12
"Model the Activity log after the ROS 2 log view (rqt_console)." Yes for its table and its filter model: # · Message · Severity · Node · Stamp · Location, exclude and highlight lists, "show highlighted only", and pause. Three changes: Node becomes the entity, Location becomes the source, and identical repeats collapse into one row with ×N. In the docs' own screenshot, rows #339 to #342 are the same wall hit.20,21
"Possibly the status format could be like the ROS log as well?" No for the status, yes for the event. ROS itself keeps /diagnostics (state, structured, "for a person") apart from /rosout (occurrences), and records both side by side.25,23 What crosses over is a status transition, and it becomes an Event.
"It's basically the computer logging stuff… a local log viewer just for the computer logs?" Wider and narrower than that. Wider, because it is the computer and everything plugged into it, in the host's words. Narrower, because it holds only coded events and never the whole journal. GNOME Logs and journalctl stay the full-journal tools.48,38
"Diagnostics faults could possibly log to the logs?… a single stream you can read to get an entire picture of the device." Yes. It is the norm. AUTOSAR R4.1 had the fault memory (DEM) send a log message on every status change, carrying the DTC and freeze frame. ros2_medkit goes the other way and turns /rosout WARN+ into faults.39,27 The rule that keeps the log readable: transitions in, reports out.
"What is best practice in robotics… everything into logs… filters… its raw log stream?" Robotics practice is two wire streams (/rosout and /diagnostics), one recording (a bag or MCAP holds both), and one timeline in the viewer (Foxglove plays Log and Diagnostics panels on one clock).25,32,29 So the "single source of truth" is one append-only store with one clock, not one message type. An entity's raw stream exists in the field already: medkit serves /components/{id}/logs (all its nodes) and /apps/{id}/logs.28

Contents

  1. What the Activity view shows today
  2. The sketch: rqt_console, rebuilt for devices
  3. Criteria and the four options
  4. Best practice, from primary sources
  5. How the pieces connect
  6. The record format
  7. 19 references, with what to steal and what to avoid
  8. What needs you
  9. Deliberately left out
  10. Source Index

1 · What the Activity view shows today

RobotDiagnostics Activity view, light skin, replaying the recorded 2026-10-21 rack session F1: an attention block on top, then an activity log of 15 events, newest first, with an All events / Faults toggle
Today's Activity view, round 3 capture, replaying the recorded 10-21 rack session (F1). It already has one full-width column, newest first, and an All events / Faults toggle.17,16

Three things in this capture shape the recommendation:

2 · The sketch: rqt_console, rebuilt for devices

This is a working mock with real rows. Today is this PC's own journal for 10-23, including the 15:00 reboot. Rack session F1 is the 10-21 recording the app replays, with the proposed folding applied.19,17 Things to try:

Newest first · scrolling or opening a row pauses Live; "Resume (n new)" brings it back
#TimeSeverityEntityCodeMessageSource

How each control maps to a reference:

Columns, filters and live tail, as a spec

ElementBehaviourFrom
#The host's sequence number for the row. Filters leave gaps, and the count line says how many rows are hidden; a gap the filters do not explain means rows were lost, which MAVLink events detect the same wayrqt_console #, MAVLink seq41
TimeHH:MM:SS; hover shows ISO, source stamp and receive stamp; a boot boundary is a separator rowjournalctl -- Boot --, OTel Timestamp vs ObservedTimestamp35
Severitydebug · info · warn · error · fatal; only warn, error and fatal are colouredROS Log levels22
EntityThe entity name, not its path; a click scopes the log to itrqt_console Node, Foxglove namespaces29
CodeThe machine code (Plugged, NoAck, MoteusFault.33); empty on a raw lineK8s reason, journald MESSAGE_ID44,37
MessageOne line, with ×N for coalesced repeats and badges for the fault lifecycle ("→ fault confirmed")K8s series.count, Chrome "group similar"44,56
SourceWho said it: kernel, host, fault memory, moteus_servo, realsenserqt_console Location, OTel InstrumentationScope
Exclude / HighlightThe same filter types in both lists: containing (regex), severities, entity, time range from a selection, source; plus "highlighted only"rqt_console filter factory21
Typed searchlevel:warn means that level and above; -key: negates; the same key is ORed, different keys are ANDed; saved queries become chipsLogcat, Console.app67,47
Live tailNewest at the top; scrolling away or opening a row pauses; a "Resume · n new" pill; the count of hidden rows is always shownFoxglove follow playback, Grafana Pause/Resume, lnav "lines hidden"29,51,57
Entity scope+ children (default; the via/part_of subtree, plus rows whose hardware_id is the entity's) · this only · + path to host (adds the ports, hubs and controller it hangs off)Rerun $origin/**, medkit component logs, journalctl device match34,28,38
RawUncoded lines: the entity's kernel lines, its driver's stdout and stderr from diagnose and act, later /rosout by logger name. Off by default; on inside an entity's own logWindows Analytic/Debug channels, medkit /apps/{id}/logs42,28
Row detailargs, path, hardware_id; for a fault, its snapshot plus breadcrumbs (this entity's rows 30 s before); for a kernel row, the exact journalctl commandSentry breadcrumbs, AUTOSAR freeze frame in the DLT payload66,39

3 · Criteria and the four options

The weights come from what you have said: "single stream… entire picture of the device", the Activity view being "very busy and hard for me to read", "wrap the wire format; don't fork it", and the black-box rule that one fact counts once.5,12,8

CriterionWeightA · two views (today)B · everything in one streamC · one store, Activity + RawD · stock viewer as the view
One read gives the whole picture of the device252553
Calm by default: readable, repeats and raw lines out203143
Stock interop: rqt_console, Foxglove and journalctl read it with no UI code152345
One fact counts once (no fault + event doubles, knock-ons folded)153242
Per-entity scope and raw drill-down in the app152452
Small build on what exists (Event, coalescer, FaultManager)105343
Score (of 5)2.653.104.403.00

4 · Best practice, from primary sources

Across the stacks surveyed below, three things are kept apart and then shown on one clock: They meet at transitions: a change of state, or a fault's lifecycle step, is an occurrence. A report is not.

ROS 2: /rosout and /diagnostics are two topics, recorded together

Foxglove and MCAP: one file, many channels, one timeline

OpenTelemetry Logs Data Model: events and logs are one stream

journald: structured fields, and a device match that walks up

Every journal entry already carries the fields a device log needs:37

journalctl /dev/node adds a match for that device and "each of its ancestor devices". -x adds catalog help text keyed on MESSAGE_ID, which is the journal's own "what to check".38 Here it is on this PC, run read-only for this report:19

$ journalctl -k -b -o short-iso /dev/ttyACM2 | tail -5 # 14:55, before the reboot; ttyACM2's parents are the cdc_acm interface 1-2:1.0 and USB device 1-2 2026-10-23T14:27:27-07:00 rack-pc kernel: usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=254 2026-10-23T14:27:27-07:00 rack-pc kernel: usb 1-2: Product: fdcanusb 2026-10-23T14:27:27-07:00 rack-pc kernel: usb 1-2: Manufacturer: mjbots 2026-10-23T14:27:27-07:00 rack-pc kernel: usb 1-2: SerialNumber: XXXXXXXX 2026-10-23T14:27:27-07:00 rack-pc kernel: cdc_acm 1-2:1.0: ttyACM2: USB ACM device $ journalctl -k -b -o json --grep 'SerialNumber: XXXXXXXX' -n 1 # 14:55; selected fields { "__REALTIME_TIMESTAMP": "1792790847316798", "_BOOT_ID": "12fdca7d9d964929824a24902e740ddf", "_TRANSPORT": "kernel", "PRIORITY": "6", "SYSLOG_IDENTIFIER": "kernel", "_KERNEL_DEVICE": "c189:13", "_KERNEL_SUBSYSTEM": "usb", "MESSAGE": "usb 1-2: SerialNumber: XXXXXXXX" } $ journalctl --list-boots | tail -2 # 15:05, after the reboot -1 12fdca7d9d964929824a24902e740ddf Wed 2026-10-21 18:38:30 PDT Fri 2026-10-23 15:00:36 PDT 0 03d10086bd434fae9166c403b4878c6f Fri 2026-10-23 15:01:07 PDT … $ journalctl -b -1 -o cat | wc -l ; journalctl -k -b -1 -o cat | wc -l ; journalctl -k -b -1 -o cat | grep -ci usb 56573 # everything the journal wrote in 44 h 22 min: about 1,275 lines an hour 11151 # the kernel's share 226 # kernel lines that mention USB: 0.4 % of the journal

The first two commands ran at 14:55, before the 15:00 reboot, when that boot was still -b. A device-node match only searches the current boot, so it cannot be rerun on the old boot now. The counts were rerun at 15:05 with -b -1 over the whole finished boot; at 14:55 they were 55,005 and 225. The JSON is trimmed to the fields shown.

AUTOSAR: fault memory (DEM) and log and trace (DLT) are two modules, and the fault memory used to log its transitions

Three more conventions worth copying

5 · How the pieces connect

Producers Kernel (journalctl -k)plug · USB errors · AER Drivers / pluginsstatuses · events · raw output Action runnerstarted · finished · result ROS nodes (later)/rosout · /diagnostics Host Status recordslatest per (path, name) · history FaultManagerpending → confirmed→ healed One append-only logcoded events → Activityuncoded lines → Rawone clock · per boot on disk leveltransitions lifecycle Views (one clock) Tree + health barown level · rollup hint Chip + entity "Faults"what is open now Activity (default)Info+ · coded · folded Entity logscope + children · Raw Faults presetlifecycle history · breadcrumbs Stock adapters (pure projections) /rosout (Log) /diagnostics journald sink MCAP export Solid: today or proposed in the app. Dashed: ROS input later, and stock projections (to_diagnostic_status exists; to_ros_log, a journald sink and an MCAP export are proposed).
The status stream and the fault memory stay state. The log is the history of both plus everything that happened. Every view reads one clock.

The fault memory relates to the log as follows:

6 · The record format

The changes are additive under record v0's own rule 8: new optional fields with defaults, and new string enum values.12 The status record does not change.

Event fieldChangeROS rcl_interfaces/LogOTel LogRecordjournald
stampkeepstampTimestamp_SOURCE_REALTIME_TIMESTAMP
receivedadd: the observer's clock, as on statusnoneObservedTimestamp__REALTIME_TIMESTAMP
severityadd debug, fatal to info|warn|errorlevel 10 / 20 / 30 / 40 / 50SeverityNumber 5 / 9 / 13 / 17 / 21PRIORITY 7 / 6 / 4 / 3 / 2
codekeep; empty means a raw linecarried in function (and [Code] in msg)EventNameMESSAGE_ID (by catalog)
messagekeepmsgBodyMESSAGE
argskeep; a confirmed fault carries its snapshotrendered into msgAttributescustom fields
path, hardware_idkeepname = the path, dotted (host.usb1.port-1-2), so ROS's logger hierarchy gives "+ children"Resource (the Entity)_KERNEL_DEVICE (kernel lines)
sourcekeepfileInstrumentationScopeSYSLOG_IDENTIFIER
seqkeeplinenone__SEQNUM
count, last_stampadd: a coalesced repeat (×N)none (one Log per repeat)nonenone (K8s series)

Sources: 22,35,36,37,44. The function/file/line placement is a proposal. It gives a lossless round trip for code, source and seq, and it is the same trick caused_by uses on DiagnosticStatus.12

What goes in, and what stays out

KindIn the log?Default viewWhy
Boot, shutdown, plug, unplug, re-enumerateyes, codedActivity, info (re-enumerate: warn)Already Events; coalesced flaps14
Kernel USB errors, driver bind and unbind, PCIe AERyes, codedActivityThe peer lane's io_facts/kernel_log.py (uncommitted at 14:34) already turns these into coded notices with a count18
Fault lifecycle (confirmed, healed, cleared)yesActivity, folded onto the causing row; Faults presetOne fact, one row; "found at start" groups the host's catch-up
Status level transitionsyes, code LevelChangedActivity only when silence (→ stale or unknown) has no plug event above it; otherwise debugA warn or error transition is already the fault row; silence is not a fault, but a person wants to see it
Action runs (started, finished, result, duration)yesActivity; Actions presetToday's "utility" row17
Producer events (BoardFault, BusErrorPassive…)yesActivityThe black box says what happened to it
Raw lines: kernel lines, driver stdout and stderr, later /rosoutyes, uncodedRaw, inside an entity's logThe answer to "its raw log stream"; Windows Debug channel42
Periodic status reports, including repeated OKsnotree, history, health barReports are state; diagnostic_updater's verbose mode is the cautionary tale26
Measurements (volts, rates, temperatures)nohistory and sparklinesHome Assistant's Activity excludes entities with a unit of measurement62
The full OS journalno"Open in journal" commandAbout 1,275 lines an hour; GNOME Logs and journalctl already do it19

Stock adapters (proposed functions in contract/record.py; none exist yet)

7 · 19 references, with what to steal and what to avoid

Screenshots were captured headlessly on 2026-10-23 from each product's public docs page (or the docs repo the page is built from). Full-resolution files are in ~/io-diagnostics/reports/media/research/logs/.

1 · rqt_console (ROS 2)

The reference you named: one message table over /rosout, with exclude and highlight filter lists below it.20,21

Steal
  • The columns: # · Message · Severity · Node · Stamp · Location, and the running "Displaying 342 messages".
  • Two filter lists built from one filter factory: …containing (regex), …with severities, …from node, …from time range (taken from the selected rows), …from location, custom.
  • "Show highlighted only", pause, save and load.
Avoid
  • Identical repeats as separate rows: #339–#342 are one wall hit.
  • Filter editors taking two-thirds of the window; use chips and the View-options popover instead.
  • "Location" (a source file path), which means nothing for a USB port.
rqt_console showing 342 identical Warn messages from turtlesim with exclude and highlight filter panes
ros2_documentation, Using-Rqt-Console, images/warn.png.

2 · Foxglove Log panel (and Lichtblick, its open-source fork)

The robotics log panel. It reads ROS 1 and ROS 2 logs or foxglove.Log and plays them on the layout's shared clock.29,30

Steal
  • The log is one panel on the same clock as the Diagnostics and Plot panels. Clicking a line seeks everything to that moment.
  • A minimum level that is never bypassed by a node selection or a search match.
  • Per-node toggles; warn and error marks on the overview ruler; "follow playback" and scroll-to-bottom.
Avoid
  • A flat node list with no hierarchy, so it cannot show an entity and its children.
  • Bracketed one-line text ([ INFO][…][/node]: …) as the display. That is a terminal format.

No screenshot: the docs page has none, and the Lichtblick panel thumbnail in its repo is too small to read.

3 · macOS Console.app

The unified-log viewer: token search over process, subsystem, category and message type, with saved searches.46,47

Steal
  • Right-click a row to show or hide this property. The choice becomes a search token at once.
  • Include or exclude on each token; all tokens must match.
  • Saved searches as one-click chips in the Favorites bar.
  • Fault is distinct from Error (red dot vs yellow dot).
  • Streaming starts on Start, so the window opens quiet.
Avoid
  • The unified log's default volume, with no notion of a device's own events.
  • The admin password prompt to read logs.
macOS Console window listing log messages with type, time, process and message columns and a details pane
Apple Console User Guide, "Log messages".

4 · GNOME Logs and journalctl (this PC's own logs)

The stock viewers for the systemd journal, where the kernel's USB lines already live.48,37,38

Steal
  • A category sidebar: Important, All, Applications, System, Security, Hardware. "Hardware" is the computer's own wires.
  • journalctl's device match adds the device and every ancestor. That is "+ path to host".
  • -p severity ranges, -b per boot, -o json, and -x catalog help keyed on MESSAGE_ID.
Avoid
  • Rebuilding it. The journal runs about 1,275 lines an hour here; link to it instead.19
GNOME Logs with a category sidebar (Important, All, Applications, System, Security, Hardware) and a list of journal entries
apps.gnome.org/Logs screenshot.

5 · Windows Event Viewer

One event infrastructure with channels by audience: Admin, Operational, Analytic and Debug.42,43,49,50

Steal
  • Admin events must be actionable. Operational events are for diagnosing. Analytic and Debug are high-volume and off by default. This is the Activity vs Raw split.
  • Event ID + Source as the code.
  • Custom Views (saved filters).
  • The overview's counts of administrative events per level over 1 h, 24 h and 7 days.
Avoid
  • A tree of hundreds of providers.
  • Three dense panes on the first screen.
Windows 10 Event Viewer main screen: log tree, overview and summary of administrative events, actions pane
Wikipedia, "Event Viewer" (Windows 10 main screen).

6 · Grafana Explore and the Logs visualization (Loki)

Server log exploration with a volume histogram, dedup, live tail and context.51,52

Steal
  • A log-volume histogram above the lines, with bars per level. That is your "turn it into that bar" thought, with the health bar's clock.5
  • Dedup modes: exact, numbers, signature.
  • Live with Pause, Resume, and new lines marked.
  • "Show context" (lines around this one).
  • Filter for or out a field value from the expanded line.
Avoid
  • A query language (LogQL) as the way in.
Grafana logs visualization with coloured level markers and an expanded log line showing fields
Grafana docs, Logs visualization (v12.3).

7 · Datadog Log Explorer (Kibana Discover is the same shape)

Facets, patterns, saved views and live tail over structured logs.53,54,55

Steal
  • Patterns: similar messages cluster into one row, and the varying part is highlighted. That is the grown-up form of ×N.
  • A facet sidebar.
  • Saved views.
  • Live Tail includes logs that the index filters drop.
Avoid
  • Sampling. At high volume Live Tail shows a uniformly random sample, and a device log must never sample.
  • A wall of facets on the first screen.
Datadog Log Explorer with facet sidebar, volume timeseries and log list
Datadog docs, Log Explorer.
Datadog log patterns grouping messages with counts
Datadog docs, Log Patterns.

8 · Chrome DevTools Console

The most-used log viewer there is: levels, sidebar, URL filters and grouping.56

Steal
  • A sidebar of User messages, Errors, Warnings, Info and Verbose, drilling down by script.
  • url: and -url: positive and negative filters.
  • "Group similar messages", on by default.
  • "Preserve log" across reloads, which for this app means across reboots.
Avoid
  • Grouping that hides when each repeat happened. Keep first and last time on the ×N row.
Chrome DevTools Console sidebar with message counts per level
Chrome DevTools Console reference, sidebar.

9 · lnav (logfile navigator)

A terminal viewer that merges many log files into one timeline.57

Steal
  • Messages from all files "in time order": the many-sources, one-clock model.
  • A HIST view stacked by level.
  • The filters panel shows how many lines are hidden, so filtering is honest.
  • Out-of-order timestamps are flagged, with actual vs received time.
Avoid
  • Keyboard-only discoverability.
lnav terminal UI showing merged syslog and access log lines with colour by level
lnav docs, UI.

10 · Wireshark (live port and packet traffic)

The packet list plus Expert Information, a derived list of anomalies.58,59

Steal
  • Expert Information is a summary derived from the stream. It is grouped by severity (Chat, Note, Warn, Error), it links back to each packet, and the packet's own tree is tinted by it. That is the fault memory as a view of the log.
  • Coloring rules are display filters, and the first match wins.
Avoid
  • Raw frames in the person-facing view. Per-packet detail belongs to a bus's Raw channel.
  • The page itself calls expert info "only a hint".
Wireshark main window with packet list, details and bytes panes
Wireshark User's Guide, main window.
Wireshark Expert Information dialog grouped by severity
Wireshark User's Guide, Expert Information.

11 · Vector CANoe / CANalyzer Trace window (and Kvaser CanKing)

The CAN bus trace: the same frames shown chronologically or in a fixed position per ID.60,61

Steal
  • Chronological vs Fixed Position display mode: one window, two read models. Chronological is a scrolling log. Fixed Position keeps one row per ID, updated in place, with its signals. That is your Activity log vs your status table.
  • Diff time per ID: the measured cycle against expected_period_s.
  • CanKing's Fixed Position button "locks messages by ID".
Avoid
  • Frame-level traffic in the device's Activity log. It belongs in the CAN bus entity's Raw channel, or in tview.
Vector slide showing the CANoe Trace window in Chronological Display Mode and Fixed Position Display Mode
Vector, "Analysis and Test of CAN Applications" (ESA workshop, 2017), slide 16.

12 · Home Assistant Activity (formerly Logbook) and Repairs

The consumer smart-home answer: a human-readable activity feed per area, device and entity, plus a separate list of things that need fixing.62,63,64

Steal
  • It excludes high-frequency entities by default: sensors with a unit of measurement, a state class or a numeric device class. Continuous values stay out.
  • Filters by area, device, entity and integration.
  • logbook.log for custom entries.
  • Repairs keeps "needs your intervention" items apart, with a badge. That is fault memory vs log.
Avoid
  • Sentences with no severity at all.
  • Hiding in the view without excluding in the store.
Home Assistant activity card listing state changes with time
Home Assistant docs, Activity card.

13 · kubectl events (Kubernetes Event)

The cluster's event stream, also shown per object at the bottom of kubectl describe.44,65

Steal
  • Type (Normal/Warning) + Reason (a machine code) + the object regarded + the reporting component.
  • A repeat is one Event with series.count and lastObservedTime.
  • The per-object "Events:" section is the entity log on the detail page.
Avoid
  • Using events as state. Kubernetes calls them "informative, best-effort, supplemental data".
kubectl describe pod output ending in an Events table with Type, Reason, Age, From, Message columns
Kubernetes docs, "Debug Running Pods".

14 · Sentry breadcrumbs

The trail of events before an error, shown on the issue.66

Steal
  • Each breadcrumb has type, category, level, message and data.
  • A drawer with search, filters by type and level, and time relative to the error.
  • For this app: a fault's detail shows that entity's log for the 30 s before first_occurred. That is your flight recorder rule, "save what just happened".10
Avoid
  • A buffer that lives only in the client. Here, breadcrumbs are just a query on the host's log.
Sentry issue page breadcrumbs section listing typed, levelled events before an exception
Sentry docs, Breadcrumbs.

15 · Android Studio Logcat

The best typed filter grammar in the set.67

Steal
  • level:WARN means that level and higher.
  • tag:, -tag: and tag~: (regex); age:5m; is:crash; package:mine.
  • The same key is ORed and different keys are ANDed; &, | and parentheses when needed.
  • Favourite queries; split panes, each with its own query.
  • PROCESS STARTED and ENDED markers, which are your Booted and Restarted rows.
Avoid
  • A colour per tag. Colour for identity competes with colour for severity.
Android Studio Logcat window with date, pid, tag, package, priority and message columns
Android Developers, Logcat window.
Logcat query field with key suggestions
Logcat query suggestions.

16 · Rerun TextLog view

Log lines that live on entity paths, in a viewer whose views are scoped by path rules.33,34

Steal
  • A view's origin plus + $origin/** and - $origin/… rules give entity scope with children and carve-outs. This is the model for "+ children".
  • A level row filter.
  • A timeline column shared with every view.
Avoid
  • Building on it. The view is marked unstable.
Rerun text log view with timeline, entity path, level and body columns
Rerun docs, TextLogView.

17 · COVESA DLT Viewer (AUTOSAR log and trace)

The automotive log viewer for DLT: ECU → Application → Context identity, with remote control of log levels.68,40

Steal
  • A three-level identity for filtering: ECU ID, Application ID, Context ID. Yours is the entity tree.
  • Log levels can be set per application and context from the viewer: the equivalent of a "more detail for this entity" switch.
  • Filter types Positive, Negative and Marker (with a colour).
Avoid
  • Four-character IDs.
  • Non-verbose messages that need an external description file to read.
DLT Viewer main window with project tree of ECUs, applications and contexts, and the message table
COVESA dlt-viewer docs, main window.
DLT Viewer filter configuration dialog with Positive, Negative, Marker types and ECU, Application, Context ids
dlt-viewer docs, filter configuration.

18 · Ignition Alarm Journal (industrial HMI, ISA-18.2 world)

SCADA keeps live alarms and alarm history in two components.69

Steal
  • The Alarm Journal Table "displays the history of the alarm system": active, acknowledged and cleared events stored by a journal.
  • It has state and priority filters, text search, and realtime or historical date ranges; the default is the last 8 hours.
  • Live alarms live in a separate status component where you act on them. That is your fault memory vs log.
Avoid
  • A history that depends on a separately configured journal profile and database.
Ignition Perspective Alarm Journal Table with filter chips and rows of alarm events
Inductive Automation docs, Perspective Alarm Journal Table.

19 · ros2_medkit (SOVD for ROS 2)

The closest robotics peer to RobotDiagnostics. It serves faults, data, operations, configurations and logs per entity.27,28

Steal
  • /components/{id}/logs covers all of a component's nodes (prefix match); /apps/{id}/logs is exact. That is "an entity's raw log stream", already in the field.
  • logs/configuration to change an entity's log level.
  • A rosbag of the seconds around each fault.
Avoid
  • Hashed fault codes (LOG_NODE_1A2B3C4D). Prefer the producer's own code.
  • Promoting every WARN log line to a fault. In this app the log and the fault memory each keep their own job.

No screenshot. medkit's UI is the Foxglove extension, and the docs reached here show no image of its logs tab.

8 · What needs you (silence takes the default)

  1. Activity and Raw as the two channels, with coded events in Activity, uncoded lines in Raw, and Raw off outside an entity's own log. Recommend yes. Default: yes.
  2. Status transitions. A warn or error transition rides on the fault row. Silence (→ stale or unknown) gets its own warn row only when no plug or unplug event on its path explains it. All other transitions are debug. Default: that rule.
  3. Fold the fault lifecycle onto the causing row ("→ fault confirmed" badge), and group faults confirmed in the host's first reports into one "found at start" row. Default: yes.
  4. Keep the host's events on disk: append-only JSONL per boot under ~/.local/state/io-diagnostics/log/, size-capped, so faults, actions and transitions survive a restart. Today's reboot erased them. Default: yes, about a 20 MB cap.
  5. Adapter order: the to_ros_log/from_ros_log pair first (pure functions, tested like to_diagnostic_status), then a journald sink, then MCAP export. Default: only the pure functions in the next build.
  6. Order: newest first, as rqt_console and today's view do, not the tail at the bottom like Grafana and Logcat. Default: newest first.

9 · Deliberately left out

Source Index

  1. Vault: Software Design (Notion import, 2025-04-12): "All logs to rosout for ground truth introspection"
  2. Vault: Ideas for tomorrow (APPLE NOTE): "Make logs a first class citizens"
  3. Vault: bam_logger - Data Logging (2025-07-26): circular buffer, save retrospectively
  4. Vault: Timeline view of robotics data (2025-07-26): "Ok its all about event based!"
  5. Vault: Daily Note - Oct 23 2026: Activity feedback ("only like 1 activity colum"; "turn into that bar… like the daginstics log")
  6. Vault: MOC - Diagnostics
  7. Vault: IO Diagnostics — Prior Art and Converged Design (2026-10-22); repo docs/converged-design-2026-10-22.md §7 (Lichtblick lacks presence, actions, USB skeleton)
  8. Vault: Diagnostics Rollups — Five Ways to Reconcile Black Boxes with Top-Level Checks (2026-10-23)
  9. Vault: C - Diagnostics Record (What We Learned Since ROS DiagnosticStatus)
  10. Vault: C - Flight Recorder Debugging (Save the Last 30 Seconds, Not the Next)
  11. Vault: Foxglove vs Rerun — Logging Boundary and Backend Decision (Deep Research, 2026-07-21)
  12. ~/io-diagnostics/docs/diagnostics-record-v0.md (Event, Fault, rules 5 and 8, "Deliberately left out")
  13. ~/io-diagnostics/contract/record.py (EVENT_SEVERITIES, Event, Fault, FaultManager, DEFAULT_DEBOUNCE)
  14. ~/io-diagnostics/io_diagnostics/activity.py (coalesced plug notices, BOOT_WINDOW_S, Booted)
  15. ~/io-diagnostics/docs/api-v1.md (/api/v1/activity)
  16. ~/io-diagnostics/docs/round3-brief-2026-10-23.md (#6 colours, #9 Activity)
  17. ~/io-diagnostics/reports/media/round3/a-activity-light.png (replay F1 of the 10-21 rack session)
  18. ~/io-diagnostics/io_facts/kernel_log.py (peer lane, uncommitted, mtime 14:34 on 2026-10-23)
  19. This PC's journal, read-only (journalctl), 2026-10-23 14:55 and 15:05; boot 12fdca7d…, 2026-10-21 18:38:30 → 2026-10-23 15:00:36
  20. ROS 2 docs, Using rqt_console: docs.ros.org, read from ros2_documentation
  21. rqt_console source, filter factory: console_widget.py
  22. rcl_interfaces/msg/Log.msg
  23. ROS 2 docs, About logging: About-Logging.rst
  24. rmw qos_profiles.h (rmw_qos_profile_rosout_default)
  25. REP-107, Diagnostic System for Robots Running ROS
  26. diagnostic_updater.cpp (verbose_ in Updater::update())
  27. ros2_medkit_log_bridge (v0.7.0)
  28. ros2_medkit_gateway (logs endpoints, entity types)
  29. Foxglove, Log panel
  30. foxglove.Log and LogLevel
  31. Foxglove, Events
  32. MCAP specification
  33. Rerun, TextLogView
  34. Rerun, entity queries
  35. OpenTelemetry, Logs Data Model
  36. OpenTelemetry, Logs Data Model Appendix (A: mappings; B: SeverityNumber)
  37. systemd.journal-fields(7)
  38. journalctl(1)
  39. AUTOSAR SWS Diagnostic Log and Trace, R4.1.3, §7.3.3.3.1 (SWS_Dlt_00474–00479, 00377)
  40. AUTOSAR CP SWS Diagnostic Log and Trace, R25-11 (change history 4.4.0; ECU / Application / Context ID; levels)
  41. MAVLink, Events interface
  42. Microsoft, ChannelType (Admin, Operational, Analytic, Debug)
  43. Microsoft, Defining severity levels
  44. Kubernetes API, Event v1
  45. Apex.AI, Diagnostics Reimagined
  46. Apple, Console: log messages
  47. Apple, Console: find log messages and activities
  48. GNOME Logs
  49. Wikipedia, Event Viewer (screenshot)
  50. Microsoft Learn, Inside: Event Viewer
  51. Grafana, Logs in Explore
  52. Grafana, Logs visualization
  53. Datadog, Log Explorer
  54. Datadog, Live Tail
  55. Datadog, Log Patterns
  56. Chrome DevTools, Console features reference
  57. lnav, User interface
  58. Wireshark, Packet colorization
  59. Wireshark, Expert Information
  60. Vector, Analysis and Test of CAN Applications (ESA, 2017), slide 16
  61. Kvaser, CanKing Message Trace
  62. Home Assistant, Logbook (Activity)
  63. Home Assistant, Activity card
  64. Home Assistant, Repairs
  65. Kubernetes, Debug Running Pods
  66. Sentry, Breadcrumbs
  67. Android Developers, Logcat
  68. COVESA, DLT Viewer
  69. Inductive Automation, Perspective Alarm Journal Table