seq_logger/
lib.rs

1extern crate log;
2
3use log::{Level, Log, Metadata, Record, SetLoggerError};
4use std::sync::Mutex;
5
6struct SeqLogger {
7    level: Level,
8    start: u64,
9    end: u64,
10    seq: Mutex<u64>,
11}
12
13impl Log for SeqLogger {
14    fn enabled(&self, metadata: &Metadata) -> bool {
15        metadata.level() <= self.level
16    }
17
18    fn log(&self, record: &Record) {
19        let mut seq = self.seq.lock().unwrap();
20        println!("[{}] {} - {}", *seq, record.level(), record.args());
21        if *seq >= self.end {
22            *seq = self.start;
23        } else {
24            *seq = *seq + 1;
25        }
26    }
27
28    fn flush(&self) {}
29}
30
31pub fn init_with_level_and_start_seq(
32    level: Level,
33    start: u64,
34    max_seq: Option<u64>,
35) -> Result<(), SetLoggerError> {
36    let logger = SeqLogger {
37        level,
38        start,
39        end: max_seq.unwrap_or(u64::max_value()),
40        seq: Mutex::new(start),
41    };
42    log::set_boxed_logger(Box::new(logger))?;
43    log::set_max_level(level.to_level_filter());
44    Ok(())
45}
46
47pub fn init() -> Result<(), SetLoggerError> {
48    init_with_level_and_start_seq(Level::Trace, 1, None)
49}