1use {
4 lazy_static::lazy_static,
5 std::sync::{Arc, RwLock},
6};
7
8lazy_static! {
9 static ref LOGGER: Arc<RwLock<env_logger::Logger>> =
10 Arc::new(RwLock::new(env_logger::Logger::from_default_env()));
11}
12
13struct LoggerShim {}
14
15impl log::Log for LoggerShim {
16 fn enabled(&self, metadata: &log::Metadata) -> bool {
17 LOGGER.read().unwrap().enabled(metadata)
18 }
19
20 fn log(&self, record: &log::Record) {
21 LOGGER.read().unwrap().log(record);
22 }
23
24 fn flush(&self) {}
25}
26
27fn replace_logger(logger: env_logger::Logger) {
28 log::set_max_level(logger.filter());
29 *LOGGER.write().unwrap() = logger;
30 let _ = log::set_boxed_logger(Box::new(LoggerShim {}));
31}
32
33pub fn setup_with(filter: &str) {
37 let logger =
38 env_logger::Builder::from_env(env_logger::Env::new().filter_or("_RUST_LOG", filter))
39 .format_timestamp_nanos()
40 .build();
41 replace_logger(logger);
42}
43
44pub fn setup_with_default(filter: &str) {
46 let logger = env_logger::Builder::from_env(env_logger::Env::new().default_filter_or(filter))
47 .format_timestamp_nanos()
48 .build();
49 replace_logger(logger);
50}
51
52pub fn setup() {
54 setup_with_default("error");
55}
56
57pub fn setup_file_with_default(logfile: &str, filter: &str) {
61 use std::fs::OpenOptions;
62 let file = OpenOptions::new()
63 .write(true)
64 .create(true)
65 .append(true)
66 .open(logfile)
67 .unwrap();
68 let logger = env_logger::Builder::from_env(env_logger::Env::new().default_filter_or(filter))
69 .format_timestamp_nanos()
70 .target(env_logger::Target::Pipe(Box::new(file)))
71 .build();
72 replace_logger(logger);
73}