1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
extern crate log;

use log::{Level, Log, Metadata, Record, SetLoggerError};
use std::sync::Mutex;

struct SeqLogger {
    level: Level,
    start: u64,
    end: u64,
    seq: Mutex<u64>,
}

impl Log for SeqLogger {
    fn enabled(&self, metadata: &Metadata) -> bool {
        metadata.level() <= self.level
    }

    fn log(&self, record: &Record) {
        let mut seq = self.seq.lock().unwrap();
        println!("[{}] {} - {}", *seq, record.level(), record.args());
        if *seq >= self.end {
            *seq = self.start;
        } else {
            *seq = *seq + 1;
        }
    }

    fn flush(&self) {}
}

pub fn init_with_level_and_start_seq(
    level: Level,
    start: u64,
    max_seq: Option<u64>,
) -> Result<(), SetLoggerError> {
    let logger = SeqLogger {
        level,
        start,
        end: max_seq.unwrap_or(u64::max_value()),
        seq: Mutex::new(start),
    };
    log::set_boxed_logger(Box::new(logger))?;
    log::set_max_level(level.to_level_filter());
    Ok(())
}

pub fn init() -> Result<(), SetLoggerError> {
    init_with_level_and_start_seq(Level::Trace, 1, None)
}