Skip to content
Docs
foxborne.comRequest a pilot

journalctl JSON exports

Export the companion computer's systemd journal with journalctl -o json for the window or boot of a run. Foxborne reads the realtime and monotonic timestamps, the boot ID and the fields that say who logged each line.

ReferenceMarkdown
On this page6

The companion computer's systemd journal records what the autonomy stack, systemd and the kernel did during a run. Export it with journalctl -o json, which writes one JSON object per line, and import the file with the flight log. Foxborne reads it with parser journal 0.6.0.

If the companion collector is installed, it delivers the allowlisted journal units on its own. An export still matters for vehicles without a collector, and for lines from units outside the collector's allowlist.

Export the journal#

Run the export on the companion computer as root, or as a member of the systemd-journal group, so it includes the system and kernel entries. Name the file for the host, as in uas04-orin-journal.json.

To export the window of a run, give its start and end in UTC:

On the companion computerExample values: the window around run R-0931Shell
sudo journalctl -o json --since "2026-09-24 14:10:00 UTC" --until "2026-09-24 14:40:00 UTC" > uas04-orin-journal.json

To export a whole boot, find its boot ID, then pass it to -b:

On the companion computerExample values: the boot that covers run R-0931Shell
sudo journalctl --list-boots
sudo journalctl -o json -b 9b2e4c1d0f8a4e57b3c2a1d9e8f7c6b5 > uas04-orin-journal.json

Export the whole journal for the window or the boot, not single units. The rules read the kernel's lines and systemd's lines about each unit, and a -u filter leaves the kernel's lines out.

A time window needs a correct clock

--since and --until select entries by the companion's wall clock. If chrony never synchronized, that clock can be hours off.

In INC-0139 the companion's journal stamped a crash at 03:14:07, during a flight that the flight log places after 14:05 UTC. Export by boot ID when you are not sure of the clock.

Fields Foxborne uses#

FieldWhat it holdsIn the INC-0142 kill
__REALTIME_TIMESTAMPWall-clock time when journald received the entry, in microseconds since the epoch, as a decimal string1790260324118000, which is 14:32:04.118 UTC
__MONOTONIC_TIMESTAMPMonotonic time when journald received the entry, in microseconds, meaningful only with the boot ID1152904000, 1,152.904 s after boot
_BOOT_IDThe kernel's ID for the boot, 128 bits in hex9b2e4c1d0f8a4e57b3c2a1d9e8f7c6b5
_HOSTNAMEThe host that logged the entryuas04-orin
PRIORITYThe syslog level, from 0 (emerg) to 7 (debug), as a decimal string3
SYSLOG_IDENTIFIERThe syslog tag of the program that logged itkernel
_PIDThe ID of the process that logged itAbsent on kernel lines. systemd's own lines carry 1.
_TRANSPORTHow journald received the entry: audit, driver, syslog, journal, stdout or kernelkernel
UNITThe unit a message from systemd is aboutAbsent on the kill. systemd's next line carries perception.service.
MESSAGEThe text of the entryThe kernel's kill line, below

Each field has a job in the investigation:

  • Time. __REALTIME_TIMESTAMP places each entry on the companion's wall clock. __MONOTONIC_TIMESTAMP and _BOOT_ID place it on the monotonic clock of its boot, the clock that collector samples share.
  • Level. PRIORITY sets how an entry shows: the timeline marks priority 3 or lower red and 4 amber. The event page labels 2 or lower Critical, 3 Error and 4 Warning.
  • Source. _HOSTNAME, SYSLOG_IDENTIFIER, _PID, _TRANSPORT and UNIT say who logged the entry and what it is about. The event page's tags carry them as host, identifier, pid, transport and unit.
  • Text. MESSAGE is quoted exactly wherever the entry appears as evidence, with the line it came from.
PRIORITYLevel
0emerg
1alert
2crit
3err
4warning
5notice
6info
7debug

How Foxborne recognizes the export#

Foxborne looks for __REALTIME_TIMESTAMP in the file's first 4,096 bytes. The file's row then reads journalctl JSON export with Journal fields found. journalctl's default short output carries no field names, so Foxborne cannot recognize it.

Clocks and chrony#

Both timestamps mark when journald received the entry, not when the program wrote it. __REALTIME_TIMESTAMP is usually a little later than _SOURCE_REALTIME_TIMESTAMP, the earliest trusted time of the message.

Wall time is only as good as the clock under it, and chrony disciplines that clock. Foxborne anchors the journal to UTC while chrony reports a synchronized source. For run R-0931 the run page reads chrony, synchronised, offset −1.8 ms, and the example dataset carries ±6 ms on the journal.

When chrony has no source, chronyc tracking shows Leap status : Not synchronised. In INC-0139, chronyd logged No suitable source for synchronisation at boot, and the run page reads None: chrony never synchronised. The journal then stays on its own clock, and an engineer can align it by hand.

Record chronyc tracking before and after each run, and keep the output with the journal.

Example: the kill in INC-0142#

The kernel killed perception_node for running out of memory at 14:32:04.118 UTC. This is the entry in the example dataset's export, on several lines to read:

uas04-orin-journal.jsonExample dataset, INC-0142, line 18,314JSON
{
  "__REALTIME_TIMESTAMP": "1790260324118000",
  "__MONOTONIC_TIMESTAMP": "1152904000",
  "_BOOT_ID": "9b2e4c1d0f8a4e57b3c2a1d9e8f7c6b5",
  "_HOSTNAME": "uas04-orin",
  "PRIORITY": "3",
  "SYSLOG_IDENTIFIER": "kernel",
  "_TRANSPORT": "kernel",
  "MESSAGE": "Out of memory: Killed process 2213 (perception_node) total-vm:11873248kB, anon-rss:6823516kB, file-rss:10240kB, shmem-rss:0kB, UID:1001 pgtables:14720kB oom_score_adj:0"
}

systemd's lines about the units follow. Each carries SYSLOG_IDENTIFIER systemd, _PID 1 and the unit in UNIT.

Time, UTCPRIORITYUNITMESSAGE
14:32:04.1215perception.serviceperception.service: A process of this unit has been killed by the OOM killer.
14:32:04.1335perception.serviceperception.service: Main process exited, code=killed, status=9/KILL
14:32:04.1344perception.serviceperception.service: Failed with result 'oom-kill'.
14:32:04.1396mavlink-router.serviceStopping MAVLink router...
14:32:04.1526mavlink-router.serviceStopped MAVLink router.
14:32:09.1416perception.serviceperception.service: Scheduled restart job, restart counter is at 1.
14:32:09.2036mavlink-router.serviceStarted MAVLink router.
14:32:09.2146perception.serviceStarted Perception service.

The event page's Unit history lays out the same lines. The process_exit rule fired on the exit of perception.service and on the stop of mavlink-router.service, and service_restart fired on the restart.