breadcrumbs 0.1.5

A beautiful, tiny traceback and logging library supporting #![no_std] rust.
Documentation
# breadcrumbs
Breadcrumbs is a beautiful, tiny traceback and logging library for Rust that offers seamless integration with `#![no_std]`, multi-threading and concurrency. 

## Features
- Beautifully-formatted traceback of logs (supporting `Display` and `Debug`)
- Dynamic log levels
- Dynamic log channels
- Seamless integration with `#![no_std]`
- Multi-threading and concurrent logging supported with no special syntax
- Easy-to-use macros
- Support for listeners to be notified of new logs

## Usage
Add the following to your `Cargo.toml`:
```toml
[dependencies]
breadcrumbs = "0.1.5"
```

Then, initalize `breadcrumbs` once in your `main.rs` or `lib.rs`:
```rust
use breadcrumbs::init;

init!();
```

You can set a custom log listener with ease by implementing the `LogListener` trait:
```rust
use breadcrumbs::{init, LogListener, Log, LogLevel};

struct MyLogListener;
 
impl LogListener for MyLogListener {
    fn on_log(&mut self, log: Log) {
        if log.level.is_at_least(LogLevel::Warn) {
            println!("{}", log);
        } else {
            // 💡 New in 0.1.5 - Remove unnecessary logs to save memory
            // Useful in embedded usecases
            log.remove();
        }
    }
}
 
init!(MyLogListener);
```

Then, simply use the `log!` macro from or its variants from anywhere to log messages:
```rust
use breadcrumbs::{log, log_level, log_channel, LogLevel};

// A basic log message
log!("Hello, world!");

// A log message with a custom level
log_level!(LogLevel::Info, "Test log message");

// A log message with a custom channel
log_channel!("test_channel", "Test log message");

// A log message with a custom channel and level
log!(LogLevel::Info, "test_channel", "Test log message");
```

Access a traceback of log messages from anywhere with the `traceback!` macro or its variants:
```rust
use breadcrumbs::{traceback, traceback_channel, traceback_level, LogLevel};

// A basic traceback, fetching all logged messages
let t = traceback!();

// A traceback with a custom channel, fetching messages in this channel
let t = traceback_channel!("my-channel");

// A traceback with a custom level, fetching messages of this level or higher
let traceback = traceback_level!(LogLevel::Warn);

// A traceback with a custom channel and level, fetching messages in this channel of this level or higher
let traceback = traceback!(LogLevel::Warn, "test_channel");
```

`Traceback` and `Log` objects beautifully implement `Display` and `Debug`:
```rust
use breadcrumbs::traceback;

let t = traceback!();
println!("{}", t);
println!("{:?}", t);
```

## Example

```rust
use breadcrumbs::{init, log, log_level, log_channel, traceback, LogLevel, LogListener, Log};

struct MyLogListner;

impl LogListener for MyLogListner {
    fn on_log(&mut self, log: Log) {
        if log.level.is_at_least(LogLevel::Warn) {
            println!("{}", log);
        }
    }
}

fn main() {
    init!(MyLogListner);

    log!("Hello, world!");
    log_level!(LogLevel::Info, "Test log message");
    log_channel!("test_channel", "Test log message");
    log!(LogLevel::Warn, "test_channel", "Test log message");

    let t = traceback!();
    println!("Fatal Error! Traceback:\n{}", t);
}
```