Skip to main content

Modern terminal-based viewer for ULog embedded traces with real-time serial monitoring

Project description

µLogger

Modern terminal-based viewer for ULog embedded traces

µLogger is a powerful TUI (Text User Interface) application for viewing real-time logs from embedded systems using the ULog API. It combines a serial console with intelligent log parsing and filtering capabilities.

Release Python

✨ Features

  • 🖥️ Modern Textual TUI - Beautiful terminal interface with rich formatting
  • 📦 Standalone Executable - No Python installation required (Windows)
  • 🎨 Color-Coded Logs - Different colors for each log level
  • 🔍 Advanced Filtering - Filter by file, log level, or search text
  • 💾 Persistent Settings - Remembers recent files and COM ports
  • 🔌 Hot-Swap COM Ports - Change serial ports without restarting
  • 📊 Real-Time Statistics - Live log counts and buffer status
  • 🔎 Log Viewer - Browse all log definitions from ELF file

🚀 Quick Start

Download Standalone Executable (Windows)

  1. Download ulogger.exe from latest release
  2. Double-click to run (auto-opens in terminal) or run from command line
  3. Select your ELF file and COM port from the dialogs

Install with pip

pip install adarwoo-ulogger

Run from source

git clone https://github.com/adarwoo/ulogger.git
cd ulogger
poetry install
poetry run python -m ulogger

📖 Usage

ulogger [elf_file] [-C COM_PORT] [-l LEVEL] [-b BUFFER_DEPTH]

Example:

ulogger firmware.elf -C COM4

First time usage: Simply run ulogger and use the interactive dialogs to select your ELF file and COM port.

📸 Screenshots

Main Interface

Real-time log viewing with color-coded levels and filtering

Main View

File Filter

Filter logs by source file with per-level counts

File Filter

Level Filter

Select which log levels to display

Level Filter

Log Entries Viewer

Browse all log definitions from the ELF file with sort and search

Log Entries

File Selection

Select ELF file from recent files or browse

ELF File Selection

COM Port Selection

Choose serial port for live logging

Port Selection

💡 Note: Screenshots captured using Textual's built-in SVG export feature for crisp, scalable images.

Usage

You install the viewer using pip install or build a windows executable with pyinstaller.

usage: ulog_console.exe [-h] [-l LEVEL] [-x] [-C COMM] [-b BUFFER_DEPTH] elf

ulog trace viewer (ncurses + live UART)

positional arguments:
  elf                   Path to ELF file with .logs section

options:
  -h, --help            show this help message and exit
  -l, --level LEVEL     Display log level threshold (0–8)
  -x, --clear           Clear screen on ELF reload
  -C, --comm COMM       UART serial port (e.g. /dev/ttyUSB0 or COM4)
  -b, --buffer-depth BUFFER_DEPTH
                        Internal buffer depth (e.g. 100k, 2M). Default: 100000

⌨️ Keyboard Controls

Key Action
z Freeze/Unfreeze display (buffer keeps filling)
c Clear all logs
l Open level filter dialog
+/- Expand/Contract level filter
f Open file filter dialog
p Select COM port
r Reset all filters
e View all log entry definitions from ELF
v View all log lines in modal
q Quit application
/ Scroll up/down
PgUp/PgDn Page up/down
Home/End Jump to top/bottom

In File/Level Filter Dialogs:

  • Click on items to toggle selection
  • Press 0-8 on a file to view logs at that level
  • Press Enter on a file to view all its logs
  • Esc or q to close dialog

In Log Entries Viewer:

  • s - Cycle sort mode (none → level → file)
  • Ctrl+F - Toggle search
  • Esc - Close search or exit viewer

📋 Command-Line Options

usage: ulogger [-h] [-l LEVEL] [-x] [-C COMM] [-b BUFFER_DEPTH] [elf]

positional arguments:
  elf                   Path to ELF file with .logs section (optional)

options:
  -h, --help            Show help message
  -l, --level LEVEL     Display log level threshold (0-8, default: 8)
  -x, --clear           Clear screen on ELF reload
  -C, --comm COMM       UART serial port (e.g. /dev/ttyUSB0 or COM4)
  -b, --buffer-depth BUFFER_DEPTH
                        Internal buffer depth (e.g. 100k, 2M, default: 100000)

🎯 Log Levels

Level Name Color Use Case
0 ERROR Red Critical errors
1 WARN Yellow Warnings
2 MILE Bright Yellow Milestones
3 INFO Green General info
4 TRACE Blue Trace execution
5 DEBUG0 White Debug info
6 DEBUG1 Gray Detailed debug
7 DEBUG2 Dim Very detailed
8 DEBUG3 Dim Maximum detail

🏗️ Building from Source

Requirements

  • Python 3.9+
  • Poetry (package manager)

Development Setup

# Clone repository
git clone https://github.com/adarwoo/ulogger.git
cd ulogger

# Install dependencies
poetry install

# Run in development
poetry run python -m ulogger

# Run tests (if available)
poetry run pytest

Building Standalone Executable

# Install build dependencies
poetry add --group dev pyinstaller

# Generate icon (optional)
python create_icon.py

# Build executable
poetry run pyinstaller ulogger.spec

# Output: dist/ulogger.exe

The executable includes:

  • ✅ All Python dependencies bundled
  • ✅ Auto-terminal launch when double-clicked
  • ✅ Custom icon
  • ✅ No installation required
  • ✅ ~8.5MB single file

🔧 Technical Details

ULog Library Performance

On AVR microcontrollers, ULog provides exceptional performance:

Metric Value Description
Library Size < 300 bytes Includes UART handling and double buffer
Throughput > 3000 msg/s At 115200 baud
Flash per Log 8 bytes Zero RAM overhead
RAM Usage 30-100 bytes Configurable buffer size
CPU Cycles/Trace 214 (11µs) Single trace, no arguments
CPU Load @ 300 msg/s < 1% Includes ULog and UART
IDLE Latency < 23µs Additional reactor handler latency

How It Works

ULog uses a clever approach different from other logging libraries:

  1. Zero-Cost Metadata - All trace information (file, line, format, types) stored in ELF .logs section (unmapped, uses no flash)
  2. Minimal Runtime - Only trace ID and raw data sent over UART
  3. COBS Framing - Efficient binary framing (2 extra bytes per message)
  4. Double Buffering - One buffer for logging, one for UART transmission
  5. Reactor-Safe - Second buffer fills only when system is idle

Benefits

No preprocessing required - Unlike Trice, no JSON extraction needed ✅ Tiny footprint - 100 debug statements cost < 1KB flash ✅ No code intrusion - Linker script patch optional ✅ Smart filtering - Viewer knows all possible traces upfront ✅ Type-safe - Variable types extracted from ELF, no format strings needed

📦 Dependencies

Runtime

  • textual >= 0.96.1 - Modern TUI framework
  • pyserial >= 3.5 - Serial port communication
  • platformdirs >= 4.0.0 - Cross-platform settings storage
  • pyelftools >= 0.31 - ELF file parsing
  • sqlalchemy >= 2.0.0 - Database models

Development

  • poetry - Dependency management
  • pyinstaller >= 6.16.0 - Executable building (optional)

🤝 Contributing

Contributions welcome! Please feel free to submit a Pull Request.

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

🔗 Related Projects

💬 Support


Made with ❤️ for embedded developers

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

adarwoo_ulogger-1.2.0.tar.gz (49.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

adarwoo_ulogger-1.2.0-py3-none-any.whl (52.4 kB view details)

Uploaded Python 3

File details

Details for the file adarwoo_ulogger-1.2.0.tar.gz.

File metadata

  • Download URL: adarwoo_ulogger-1.2.0.tar.gz
  • Upload date:
  • Size: 49.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.3 CPython/3.13.3 Windows/11

File hashes

Hashes for adarwoo_ulogger-1.2.0.tar.gz
Algorithm Hash digest
SHA256 c0e08e54d06bca40db06c7a246b47ca3d4a0a170f0cf1f551381ca905e9c40fd
MD5 6f93dcb9cc1e989bfae5cfa23018b5bb
BLAKE2b-256 c5c2ed012c5265b8f375c7ef6f9d8f680b264b5eefa02450360d3a6e2b48570d

See more details on using hashes here.

File details

Details for the file adarwoo_ulogger-1.2.0-py3-none-any.whl.

File metadata

  • Download URL: adarwoo_ulogger-1.2.0-py3-none-any.whl
  • Upload date:
  • Size: 52.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.3 CPython/3.13.3 Windows/11

File hashes

Hashes for adarwoo_ulogger-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5b574d581eef638da9ee1584ece91f864119c54cbbb5ca55ec26b1218831b5bf
MD5 769e7f1ef23e39107510b324b00d56d3
BLAKE2b-256 c7c2e8eb2f4ab6f85ca0d3a1fddf6adcab07b8db29485bc4670d59f258a631b7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page