#ring-buffer #logger #logging #log #multi-threading #log-file

ring-log

High-performance logger with lock-free ring buffer

9 releases

0.2.15 Jan 3, 2025
0.2.14 Jan 3, 2025
0.1.1 Sep 23, 2024

#543 in Algorithms

Download history 171/week @ 2024-09-23 37/week @ 2024-09-30 3/week @ 2024-10-07 3/week @ 2024-12-09 760/week @ 2024-12-30 74/week @ 2025-01-06

834 downloads per month

MIT license

11KB
221 lines

build & test Crates.io license

ring-log

High-performance logger with lock-free ring buffer (SPSC), use this library when you want to log in the hotpath and performance is critical.

Example

Submitting a log to either stdout or a file is very simple, you just give a closure which evaluates to a string. This is extremely fast, usually less than 100 nanos. A simple example:

let o = LoggerFileOptions {
    path: "log.txt",
    append_mode: false, // should the logger just append to what's already there or overwrite?
};

// The size is bounded, issuing a new log when the ringbuffer is full will block.
// When passing a LoggerFileOptions, .with_log_type(LogTo::File) is set implicitly.
let logger = Logger::builder(Some(o)).with_time(true);

// Log to file
logger.info(String::new);
logger.info(|| String::from("hello"));
logger.debug(|| "foo");

// Log to stdout, without date/time
let logger = logger.with_log_type(LogTo::Ephemeral).with_time(false);

// Will now log to stdout
logger.info(String::new);
logger.info(|| String::from("hello"));
logger.debug(|| "foo");

// Set it back to file 
let logger = logger.with_log_type(LogTo::File);

// Blocks until all logs are handled. Natural race condition if this is not called.
logger.shutdown();

Dependencies

~1.5MB
~25K SLoC