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)
}