pmcore/routines/
logger.rs1use std::time::Instant;
2
3use crate::routines::output::OutputFile;
4use crate::routines::settings::Settings;
5use anyhow::Result;
6use tracing_subscriber::fmt::time::FormatTime;
7use tracing_subscriber::fmt::{self};
8use tracing_subscriber::prelude::__tracing_subscriber_SubscriberExt;
9use tracing_subscriber::registry::Registry;
10use tracing_subscriber::util::SubscriberInitExt;
11use tracing_subscriber::EnvFilter;
12
13pub(crate) fn setup_log(settings: &mut Settings) -> Result<()> {
23 if !settings.log().stdout && !settings.log().write {
25 return Ok(());
26 }
27
28 let log_level = settings.log().level.clone();
30 let env_filter = EnvFilter::new(log_level);
31
32 let timestamper = CompactTimestamp {
33 start: Instant::now(),
34 };
35
36 let subscriber = Registry::default().with(env_filter);
38
39 let outputfile = if !settings.output().write {
41 let cd = std::env::current_dir()?;
42 OutputFile::new(&cd.to_string_lossy(), "log.txt")?
43 } else {
44 OutputFile::new(&settings.output().path, "log.txt")?
45 };
46
47 let file_layer = match settings.log().write {
49 true => {
50 let layer = fmt::layer()
51 .with_writer(outputfile.file)
52 .with_ansi(false)
53 .with_timer(timestamper.clone());
54
55 Some(layer)
56 }
57 false => None,
58 };
59
60 let stdout_layer = match settings.log().stdout {
62 true => {
63 let layer = fmt::layer()
64 .with_writer(std::io::stdout)
65 .with_ansi(true)
66 .with_target(false)
67 .with_timer(timestamper.clone());
68
69 Some(layer)
70 }
71 false => None,
72 };
73
74 let res = subscriber.with(file_layer).with(stdout_layer).try_init();
76 match res {
77 Ok(_) => {}
78 Err(e) => tracing::warn!("Failed to initialize logger: {}", e),
79 }
80
81 Ok(())
82}
83
84#[derive(Clone)]
85struct CompactTimestamp {
86 start: Instant,
87}
88
89impl FormatTime for CompactTimestamp {
90 fn format_time(
91 &self,
92 w: &mut tracing_subscriber::fmt::format::Writer<'_>,
93 ) -> Result<(), std::fmt::Error> {
94 let elapsed = self.start.elapsed();
95 let hours = elapsed.as_secs() / 3600;
96 let minutes = (elapsed.as_secs() % 3600) / 60;
97 let seconds = elapsed.as_secs() % 60;
98
99 write!(w, "{:02}h {:02}m {:02}s", hours, minutes, seconds)
100 }
101}