1use chrono::Local;
2use lazy_static::lazy_static;
3use log::{debug, LevelFilter, Log, Metadata, Record};
4use parking_lot::RwLock;
5
6lazy_static! {
7 static ref LOG_LEVEL: RwLock<LevelFilter> = RwLock::new(LevelFilter::Info);
8}
9
10struct DynamicLogger;
11
12impl Log for DynamicLogger {
13 fn enabled(&self, metadata: &Metadata) -> bool {
14 metadata.level() <= *LOG_LEVEL.read()
15 }
16
17 fn log(&self, record: &Record) {
18 if self.enabled(record.metadata()) {
19 let now = Local::now();
20 println!(
21 "[{}] [{}] - {}",
22 now.format("%Y-%m-%d %H:%M:%S"),
23 record.level(),
24 record.args()
25 );
26 }
27 }
28
29 fn flush(&self) {}
30}
31
32pub fn init_logger() {
33 log::set_logger(&DynamicLogger).unwrap();
34 log::set_max_level(LevelFilter::Trace);
35}
36
37pub fn set_log_level(level: LevelFilter) {
38 *LOG_LEVEL.write() = level;
39 debug!("Log level set to {:?}!", level);
40}
41
42pub fn init_debug_logger() {
43 init_logger();
44 set_log_level(LevelFilter::Debug);
45}