cairo_lang_utils/
logging.rs1use std::sync::Once;
2
3use tracing_subscriber::EnvFilter;
4use tracing_subscriber::filter::dynamic_filter_fn;
5use tracing_subscriber::prelude::*;
6
7static INIT: Once = Once::new();
8
9#[allow(dead_code)]
10pub mod level {
11 pub const TRACE: tracing::Level = tracing::Level::TRACE;
12 pub const DEBUG: tracing::Level = tracing::Level::DEBUG;
13 pub const INFO: tracing::Level = tracing::Level::INFO;
14 pub const WARN: tracing::Level = tracing::Level::WARN;
15 pub const ERROR: tracing::Level = tracing::Level::ERROR;
16}
17
18pub fn init_logging(level: tracing::Level) {
22 INIT.call_once(|| {
23 tracing_log::LogTracer::init().ok();
25
26 let env_filter = EnvFilter::try_from_default_env()
27 .or_else(|_| EnvFilter::try_new(level.to_string()))
28 .unwrap();
29
30 let salsa_filter = exclude_salsa();
33
34 let filter = env_filter.and_then(salsa_filter);
35
36 let timer = tracing_subscriber::fmt::time::SystemTime;
37 let fmt_layer = tracing_subscriber::fmt::layer()
38 .with_timer(timer)
39 .with_ansi(false)
40 .with_level(true)
41 .with_target(false)
42 .with_file(true)
43 .with_line_number(true);
44
45 let registry = tracing_subscriber::registry().with(filter);
47 if cfg!(test) {
48 let _ = registry.with(fmt_layer.with_test_writer()).try_init();
49 } else {
50 let _ = registry.with(fmt_layer).try_init();
51 }
52 });
53}
54
55pub fn exclude_salsa() -> tracing_subscriber::filter::DynFilterFn<
59 tracing_subscriber::Registry,
60 impl Fn(
61 &tracing::Metadata<'_>,
62 &tracing_subscriber::layer::Context<'_, tracing_subscriber::Registry>,
63 ) -> bool,
64> {
65 let salsa_unmuted = std::env::var("CAIRO_UNMUTE_SALSA").is_ok();
66 dynamic_filter_fn(move |meta, _ctx| {
67 if salsa_unmuted {
68 true
70 } else {
71 !meta.target().starts_with("salsa")
73 }
74 })
75}