context_creator/
logging.rs1use anyhow::Result;
4use tracing::Level;
5use tracing_subscriber::{fmt, EnvFilter};
6
7use crate::{cli::LogFormat, Config};
8
9pub fn init_logging(config: &Config) -> Result<()> {
11 let log_level = get_log_level(config.verbose, config.quiet, config.progress);
13
14 let builder = fmt::Subscriber::builder()
16 .with_target(false)
17 .with_thread_ids(false)
18 .with_thread_names(false)
19 .with_writer(std::io::stderr);
20
21 let env_filter = if std::env::var("RUST_LOG").is_ok() {
23 EnvFilter::from_default_env()
25 } else {
26 EnvFilter::new(format!("{log_level}"))
28 };
29
30 match config.log_format {
31 LogFormat::Json => {
32 builder.json().with_env_filter(env_filter).try_init().ok();
34 }
35 LogFormat::Plain => {
36 builder.with_env_filter(env_filter).try_init().ok();
38 }
39 }
40
41 Ok(())
42}
43
44pub fn get_log_level(verbose: u8, quiet: bool, progress: bool) -> Level {
46 if quiet {
47 Level::ERROR
48 } else {
49 match verbose {
50 0 => {
51 if progress {
53 Level::INFO
54 } else {
55 Level::WARN }
57 }
58 1 => Level::DEBUG, _ => Level::TRACE, }
61 }
62}
63
64#[cfg(test)]
65mod tests {
66 use super::*;
67
68 #[test]
69 fn test_log_level_selection() {
70 assert_eq!(get_log_level(0, true, false), Level::ERROR);
72 assert_eq!(get_log_level(1, true, false), Level::ERROR);
73 assert_eq!(get_log_level(2, true, false), Level::ERROR);
74
75 assert_eq!(get_log_level(0, false, false), Level::WARN);
77 assert_eq!(get_log_level(1, false, false), Level::DEBUG);
78 assert_eq!(get_log_level(2, false, false), Level::TRACE);
79 assert_eq!(get_log_level(3, false, false), Level::TRACE);
80
81 assert_eq!(get_log_level(0, false, true), Level::INFO);
83 assert_eq!(get_log_level(0, true, true), Level::ERROR); }
85}