dlt-tui
A terminal viewer for automotive DLT (Diagnostic Log and Trace) files.
DLT logs usually live on machines you reach over SSH: test benches, HIL rigs, CI runners. The standard tooling (dlt-viewer) is a Qt desktop app, so in practice you end up copying files back to your workstation just to look at them. dlt-tui is the alternative I wanted: open the file where it is, filter down to the interesting part, and read it — all in the terminal, with vim-style keys.
What it does:
- Opens
.dltfiles, plus.dlt.gzand.dlt.zipwithout unpacking first - Loads multiple files or whole directories, merged into one timestamp-ordered timeline (useful when a session is split across per-context files)
- Filters stack on top of each other: minimum log level, APP ID, CTX ID, and regex search over payloads
- Shows a hex dump of the raw payload for any message
- Streams live from a running dlt-daemon over TCP (
--connect host:port) - Exports the currently filtered view to a file
- Parses in a streaming fashion, so large files start displaying before they finish loading
It deliberately does less than dlt-viewer — no ECU configuration, no message injection, no plugins (yet). It's for reading logs, and it tries to be very good at that.
Install
Homebrew (macOS / Linux):
Prebuilt binaries for Linux (x86_64 / aarch64, including static musl builds), macOS, and Windows are on the releases page. The musl builds run on any distro with no dependencies:
|
With a Rust toolchain (1.88+): cargo install dlt-tui, or clone and cargo build --release.
Usage
For an Android IVI target, forward the daemon port first:
A typical triage session: press l W Enter to hide everything below warnings, a DIAG Enter to narrow to one application, then / with a regex to find the message you're after, and Enter on it for the hex dump. C clears all filters. S saves the current filter stack to .dlt-tui.toml so you can reload it with L next time.
Keybindings
File Explorer
| Key | Action |
|---|---|
j / Down |
Move down |
k / Up |
Move up |
Ctrl+f / Page Down |
Page down |
Ctrl+b / Page Up |
Page up |
Ctrl+d |
Half page down |
Ctrl+u |
Half page up |
g / Home |
Jump to top |
G / End |
Jump to bottom |
Enter |
Open directory / Load file |
b |
Batch load all files in dir |
q / Esc |
Quit |
Log Viewer
| Key | Action |
|---|---|
j / Down |
Scroll down |
k / Up |
Scroll up |
Ctrl+f / Page Down |
Page down |
Ctrl+b / Page Up |
Page up |
Ctrl+d |
Half page down |
Ctrl+u |
Half page up |
Left / Right |
Scroll payload horizontally |
Shift+Left/Right |
Scroll payload horizontally fast |
g / Home |
Jump to first log |
G / End |
Jump to last log |
Enter |
Open detail view with hex dump |
/ |
Search text (regex supported) |
l |
Filter by log level (F/E/W/I/D/V) |
a |
Filter by APP ID |
c |
Filter by CTX ID |
C |
Clear all filters |
S |
Save filter block to .dlt-tui.toml |
L |
Load filter block from .dlt-tui.toml |
F |
Toggle auto-scroll (tail mode) |
t |
Toggle delta time between messages |
E |
Export filtered logs to file |
q / Esc |
Back to File Explorer |
Log Detail
| Key | Action |
|---|---|
j / k |
Navigate between log entries |
q / Esc |
Back to Log Viewer |
Paging and jump keys (Ctrl+f/b/d/u, g, G) work in the detail view too. In any filter input, Enter applies and Esc cancels the input — an already-active filter stays as it was.
Notes
- TCP mode (
--connect) and file or directory paths are mutually exclusive. - Files larger than 500 MB are rejected (the limit applies after decompression as a zip-bomb guard).
- Parsed messages remain in memory for filtering and navigation; binary-heavy or compressed logs can require several times their on-disk size in RAM.
.ziparchives: only the first file entry is read; directory entries are skipped. Zip one.dltper archive, or use.gz.Eexports the filtered view todlt_export_<timestamp>.txtin the current working directory.- Payload text is sanitized before rendering, so logs containing escape sequences can't mess with your terminal.
Planned
Tracked as issues: bookmarking and annotation, DLT lifecycle/session tracking, and pluggable payload decoders (SOME/IP, UDS).
Contributing
Issues and PRs welcome — see CONTRIBUTING.md. cargo test runs the whole suite; you can generate sample.dlt for manual testing with cargo test --test generate_sample_dlt -- --ignored --nocapture.