ferridriver_test/
logging.rs1use std::sync::Once;
33use tracing_subscriber::EnvFilter;
34
35static INIT: Once = Once::new();
36
37pub fn init(verbose: u8) {
42 INIT.call_once(|| {
43 #[cfg(feature = "tokio-console")]
45 if std::env::var("FERRIDRIVER_PROFILE").as_deref() == Ok("console") {
46 console_subscriber::init();
47 return;
48 }
49
50 let filter = build_filter(verbose);
51 let use_ansi = std::io::IsTerminal::is_terminal(&std::io::stderr());
52
53 #[cfg(feature = "profiling")]
55 if std::env::var("FERRIDRIVER_PROFILE").as_deref() == Ok("chrome") {
56 use tracing_subscriber::prelude::*;
57
58 let trace_file =
59 std::env::var("FERRIDRIVER_TRACE_FILE").unwrap_or_else(|_| format!("trace-{}.json", std::process::id()));
60 let (chrome_layer, guard) = tracing_chrome::ChromeLayerBuilder::new()
61 .file(trace_file)
62 .include_args(true)
63 .build();
64
65 std::mem::forget(guard);
67
68 let fmt_layer = tracing_subscriber::fmt::layer()
69 .with_writer(std::io::stderr)
70 .with_ansi(use_ansi);
71
72 let _ = tracing_subscriber::registry()
73 .with(filter)
74 .with(fmt_layer)
75 .with(chrome_layer)
76 .try_init();
77 return;
78 }
79
80 let _ = tracing_subscriber::fmt()
82 .with_env_filter(filter)
83 .with_writer(std::io::stderr)
84 .with_ansi(use_ansi)
85 .try_init();
86 });
87}
88
89pub fn init_from_env() {
92 if std::env::var("FERRIDRIVER_DEBUG").is_ok()
93 || std::env::var("RUST_LOG").is_ok()
94 || std::env::var("FERRIDRIVER_PROFILE").is_ok()
95 {
96 init(0);
97 }
98}
99
100fn build_filter(verbose: u8) -> EnvFilter {
102 if std::env::var("RUST_LOG").is_ok() {
104 return EnvFilter::from_default_env();
105 }
106
107 if let Ok(debug_val) = std::env::var("FERRIDRIVER_DEBUG") {
109 return parse_debug_categories(&debug_val);
110 }
111
112 match verbose {
114 0 => EnvFilter::new("warn"),
115 1 => EnvFilter::new("warn,ferridriver=debug"),
116 _ => EnvFilter::new("warn,ferridriver=trace"),
117 }
118}
119
120fn parse_debug_categories(debug_val: &str) -> EnvFilter {
122 let mut filter = EnvFilter::new("warn");
123 for category in debug_val.split(',').map(str::trim) {
124 let directive = match category {
125 "*" | "all" => "ferridriver=trace",
126 "cdp" => "ferridriver::cdp=trace",
127 "step" | "steps" => "ferridriver::bdd::step=trace",
128 "hook" | "hooks" => "ferridriver::bdd::hook=trace",
129 "worker" => "ferridriver::worker=trace",
130 "fixture" => "ferridriver::fixture=trace",
131 "reporter" => "ferridriver::reporter=trace",
132 "action" => "ferridriver::action=trace",
133 "runner" => "ferridriver::runner=trace",
134 "napi" => "napi=trace",
135 other => {
136 let owned = format!("{other}=trace");
138 filter = filter.add_directive(
139 owned
140 .parse()
141 .unwrap_or_else(|_| "warn".parse().expect("'warn' is a valid directive")),
142 );
143 continue;
144 },
145 };
146 filter = filter.add_directive(
147 directive
148 .parse()
149 .unwrap_or_else(|_| "warn".parse().expect("'warn' is a valid directive")),
150 );
151 }
152 filter
153}