|
4 | 4 | //! - `VITE_LOG`: Controls log filtering (e.g., `"debug"`, `"vite_task=trace"`) |
5 | 5 | //! - `VITE_LOG_OUTPUT`: Output format — `"chrome-json"` for Chrome DevTools timeline, |
6 | 6 | //! `"readable"` for pretty-printed output, or default stdout. |
| 7 | +//! - `VITE_LOG_OUTPUT_DIR`: Directory for chrome-json trace files (default: cwd). |
7 | 8 |
|
8 | | -use std::{any::Any, sync::atomic::AtomicBool}; |
| 9 | +use std::{any::Any, path::PathBuf, sync::atomic::AtomicBool}; |
9 | 10 |
|
10 | 11 | use tracing_chrome::ChromeLayerBuilder; |
11 | 12 | use tracing_subscriber::{ |
@@ -48,10 +49,21 @@ pub fn init_tracing() -> Option<Box<dyn Any + Send>> { |
48 | 49 |
|
49 | 50 | match output_mode.as_str() { |
50 | 51 | "chrome-json" => { |
51 | | - let (chrome_layer, guard) = ChromeLayerBuilder::new() |
| 52 | + let mut builder = ChromeLayerBuilder::new() |
52 | 53 | .trace_style(tracing_chrome::TraceStyle::Async) |
53 | | - .include_args(true) |
54 | | - .build(); |
| 54 | + .include_args(true); |
| 55 | + // Write trace files to VITE_LOG_OUTPUT_DIR if set, to avoid |
| 56 | + // polluting the project directory (formatters may pick them up). |
| 57 | + if let Ok(dir) = std::env::var(env_vars::VITE_LOG_OUTPUT_DIR) { |
| 58 | + let dir = PathBuf::from(dir); |
| 59 | + let _ = std::fs::create_dir_all(&dir); |
| 60 | + let ts = std::time::SystemTime::now() |
| 61 | + .duration_since(std::time::UNIX_EPOCH) |
| 62 | + .map(|d| d.as_micros()) |
| 63 | + .unwrap_or(0); |
| 64 | + builder = builder.file(dir.join(format!("trace-{ts}.json"))); |
| 65 | + } |
| 66 | + let (chrome_layer, guard) = builder.build(); |
55 | 67 | tracing_subscriber::registry().with(targets).with(chrome_layer).init(); |
56 | 68 | Some(Box::new(guard)) |
57 | 69 | } |
|
0 commit comments