1use colored::*;
2use env_logger::WriteStyle;
3use log::LevelFilter;
4use std::io::Write as _;
5
6pub use colored;
7pub use env_logger;
8pub use log;
9
10pub fn build(log_lvl: Option<LevelFilter>) -> env_logger::Builder {
13 let mut builder = env_logger::builder();
14
15 builder.parse_env("RUST_LOG");
16
17 if let Some(log_lvl) = log_lvl {
18 builder.filter(None, log_lvl);
19 }
20
21 builder
22 .format(|buf, record| {
23 let timestamp = chrono::Local::now()
24 .format("%H:%M:%S%p")
25 .to_string()
26 .yellow()
27 .dimmed();
28
29 let style = buf.default_level_style(record.level());
30 let level_style = format!("{style}{}{style:#}", record.level());
31
32 let target_pretty = record
33 .target()
34 .split("::")
35 .next()
36 .unwrap_or_else(|| record.target());
37
38 writeln!(
39 buf,
40 "[{}] [{}] [{}]: {}",
41 timestamp,
42 level_style,
43 target_pretty,
44 record.args()
45 )
46 })
47 .format_level(true)
48 .write_style(WriteStyle::Always);
49
50 builder
51}
52
53#[cfg(test)]
54mod tests {
55 use super::*;
56
57 #[test]
58 fn test() {
59 build(Some(LevelFilter::Error)).init();
60 log::trace!("This is a test log");
61 log::debug!("This is a test log");
62 log::info!("This is a test log");
63 log::warn!("This is a test log");
64 log::error!("This is a test log");
65 }
66}