Enable tracing. # Arguments `trace_level` - The level of information to output `trace_format` - The format of the output # Errors This function will return an error if it fails to initialize tracing.
(trace_level: Option<&TraceLevel>, trace_format: &TraceFormat)
| 25 | /// |
| 26 | /// This function will return an error if it fails to initialize tracing. |
| 27 | pub fn enable_tracing(trace_level: Option<&TraceLevel>, trace_format: &TraceFormat) { |
| 28 | let trace_level = match trace_level { |
| 29 | Some(trace_level) => trace_level, |
| 30 | None => { |
| 31 | if let Ok(trace_level) = std::env::var("DSC_TRACE_LEVEL") { |
| 32 | &match trace_level.to_lowercase().as_str() { |
| 33 | "error" => TraceLevel::Error, |
| 34 | "warn" => TraceLevel::Warn, |
| 35 | "info" => TraceLevel::Info, |
| 36 | "debug" => TraceLevel::Debug, |
| 37 | "trace" => TraceLevel::Trace, |
| 38 | _ => { |
| 39 | eprintln!("{}: {trace_level}", t!("main.invalidTraceLevel")); |
| 40 | TraceLevel::Info |
| 41 | } |
| 42 | } |
| 43 | } else { |
| 44 | &TraceLevel::Info |
| 45 | } |
| 46 | } |
| 47 | }; |
| 48 | |
| 49 | let tracing_level = match trace_level { |
| 50 | TraceLevel::Error => Level::ERROR, |
| 51 | TraceLevel::Warn => Level::WARN, |
| 52 | TraceLevel::Info => Level::INFO, |
| 53 | TraceLevel::Debug => Level::DEBUG, |
| 54 | TraceLevel::Trace => Level::TRACE, |
| 55 | }; |
| 56 | |
| 57 | let filter = EnvFilter::try_from_default_env() |
| 58 | .or_else(|_| EnvFilter::try_new("warn")) |
| 59 | .unwrap_or_default() |
| 60 | .add_directive(tracing_level.into()); |
| 61 | let layer = tracing_subscriber::fmt::Layer::default().with_writer(std::io::stderr); |
| 62 | let fmt = match trace_format { |
| 63 | TraceFormat::Default => { |
| 64 | layer |
| 65 | .with_ansi(true) |
| 66 | .with_level(true) |
| 67 | .with_line_number(true) |
| 68 | .boxed() |
| 69 | }, |
| 70 | TraceFormat::Plaintext => { |
| 71 | layer |
| 72 | .with_ansi(false) |
| 73 | .with_level(true) |
| 74 | .with_line_number(false) |
| 75 | .boxed() |
| 76 | }, |
| 77 | TraceFormat::Json => { |
| 78 | layer |
| 79 | .with_ansi(false) |
| 80 | .with_level(true) |
| 81 | .with_line_number(true) |
| 82 | .json() |
| 83 | .boxed() |
| 84 | } |