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 style = buf.default_level_style(record.level());
24 let level_style = format!("{style}{}{style:#}", record.level());
25
26 let target_pretty = record
27 .target()
28 .split("::")
29 .next()
30 .unwrap_or_else(|| record.target());
31
32 if cfg!(debug_assertions) {
33 writeln!(
34 buf,
35 "[{}] [{}]: {}",
36 level_style,
37 target_pretty,
38 record.args()
39 )
40 } else {
41 let timestamp = chrono::Local::now()
42 .format("%I:%M:%S%p")
43 .to_string()
44 .yellow()
45 .dimmed();
46
47 writeln!(
48 buf,
49 "[{}] [{}] [{}]: {}",
50 timestamp,
51 level_style,
52 target_pretty,
53 record.args()
54 )
55 }
56 })
57 .format_level(true)
58 .write_style(WriteStyle::Always);
59
60 builder
61}
62
63#[cfg(test)]
64mod tests {
65 use super::*;
66
67 #[test]
68 fn test() {
69 build(Some(LevelFilter::Error)).init();
70 log::trace!("This is a test log");
71 log::debug!("This is a test log");
72 log::info!("This is a test log");
73 log::warn!("This is a test log");
74 log::error!("This is a test log");
75 }
76}