kataglyphis_rustprojecttemplate/
logging.rs

1// src/logging.rs — Logger initialisation and the `success!` macro.
2
3use std::io::Write;
4
5/// Initialise the `env_logger` with a loguru-style format (`HH:MM:SS | LEVEL | msg`).
6///
7/// Logging behaviour:
8/// - If `RUST_LOG` is set, the user has full control.
9/// - Otherwise default to INFO (override with `KATAGLYPHIS_LOG_LEVEL`).
10/// - Noisy wgpu / naga modules are clamped to WARN.
11pub fn init_logger() {
12    let mut builder = env_logger::Builder::from_env(env_logger::Env::default());
13
14    builder.format(|buf, record| {
15        let ts = chrono::Local::now().format("%H:%M:%S");
16        let level = if record.target() == "SUCCESS" {
17            "SUCCESS"
18        } else {
19            match record.level() {
20                log::Level::Error => "ERROR",
21                log::Level::Warn => "WARN",
22                log::Level::Info => "INFO",
23                log::Level::Debug => "DEBUG",
24                log::Level::Trace => "TRACE",
25            }
26        };
27        writeln!(buf, "{ts} | {level:<8} | {}", record.args())
28    });
29
30    if std::env::var_os("RUST_LOG").is_none() {
31        let level = crate::config::log_level();
32
33        builder.filter_level(level);
34
35        // Suppress very chatty modules.
36        for module in &["wgpu", "wgpu_core", "wgpu_hal", "naga"] {
37            builder.filter_module(module, log::LevelFilter::Warn);
38        }
39    }
40
41    builder.init();
42}
43
44/// Log a message at INFO level with the target set to `"SUCCESS"` so the
45/// formatter renders it with the `SUCCESS` label.
46#[macro_export]
47macro_rules! success {
48    ($($arg:tt)*) => {
49        log::info!(target: "SUCCESS", $($arg)*);
50    };
51}