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}