probably_fine_log 0.1.0

Fast, zero-dependency error logger for all platforms
Documentation
  • Coverage
  • 5.88%
    2 out of 34 items documented1 out of 22 items with examples
  • Size
  • Source code size: 15.7 kB This is the summed size of all the files inside the crates.io package for this release.
  • Documentation size: 582.54 kB This is the summed size of all files generated by rustdoc for all configured targets
  • Ø build duration
  • this release: 35s Average build duration of successful builds.
  • all releases: 35s Average build duration of successful builds in releases after 2024-10-23.
  • Links
  • crates.io
  • Dependencies
  • Versions
  • Owners
  • Retroboi64

probably_fine_log

A fast, zero-dependency error logger for Rust — works on every platform including embedded targets.

Features

Feature Detail
Zero dependencies Only the Rust standard library
Lock-free filtering AtomicUsize max-level check — filtered calls cost ~1 ns
Thread-safe Global logger installed with OnceLock; no mutex on the hot path
Structured records File, line, module path, and millisecond timestamp on every record
Pluggable Implement the Logger trait to write to files, ring buffers, sockets, …
All platforms Linux, macOS, Windows, WASM, embedded (no_std with default-features = false)

Quick start

# Cargo.toml
[dependencies]
probably_fine_log = "0.1"
use probably_fine_log::{set_logger, set_max_level, StderrLogger, Level};
use probably_fine_log::{error, warn, info, debug, trace};

fn main() {
    // Install once at program start
    set_logger(StderrLogger::new()).unwrap();
    set_max_level(Level::Debug);

    info!("Listening on port {}", 8080);
    debug!("Connection pool size: {}", 16);
    warn!("Retry {}/{}", 2, 3);
    error!("Fatal: {}", "disk full");
}

Output (with colour):

2024-01-15T12:34:56.012Z [INFO ] my_app                           Listening on port 8080 (src/main.rs:9)
2024-01-15T12:34:56.013Z [DEBUG] my_app                           Connection pool size: 16 (src/main.rs:10)
2024-01-15T12:34:56.014Z [WARN ] my_app                           Retry 2/3 (src/main.rs:11)
2024-01-15T12:34:56.015Z [ERROR] my_app                           Fatal: disk full (src/main.rs:12)

Custom logger

use probably_fine_log::{Logger, Record, set_logger};

struct MyLogger;

impl Logger for MyLogger {
    fn log(&self, record: &Record<'_>) {
        // write to a file, network socket, ring buffer…
        eprintln!("[{}] {}", record.level, record.message);
    }
    fn flush(&self) { /* optional */ }
}

fn main() {
    set_logger(MyLogger).unwrap();
}

Level filtering

Filtering is a single relaxed atomic load — below the noise floor of any I/O:

set_max_level(Level::Warn); // only Error + Warn pass through

Log levels

Macro Level Numeric
error! Level::Error 1
warn! Level::Warn 2
info! Level::Info 3
debug! Level::Debug 4
trace! Level::Trace 5

Records with a numeric value greater than the current max are dropped before the logger is called.

no_std support

Disable the default std feature to compile on bare-metal targets:

[dependencies]
probably_fine_log = { version = "0.1", default-features = false }

In no_std mode the macros and NullLogger are available; StderrLogger, timestamp formatting, and set_logger require std.

License

MIT