monitord/
logging.rs

1use std::io::stderr;
2use std::io::IsTerminal;
3
4use clap::ValueEnum;
5use tracing_glog::Glog;
6use tracing_glog::GlogFields;
7use tracing_subscriber::filter::LevelFilter;
8use tracing_subscriber::fmt;
9use tracing_subscriber::prelude::*;
10use tracing_subscriber::Registry;
11
12// This enum can be used to add `log-level` option to CLI binaries.
13#[derive(ValueEnum, Clone, Debug, Copy)]
14pub enum LogLevels {
15    Error,
16    Warn,
17    Info,
18    Debug,
19    Trace,
20}
21
22impl From<LogLevels> for LevelFilter {
23    fn from(public_level: LogLevels) -> Self {
24        match public_level {
25            LogLevels::Error => LevelFilter::ERROR,
26            LogLevels::Warn => LevelFilter::WARN,
27            LogLevels::Info => LevelFilter::INFO,
28            LogLevels::Debug => LevelFilter::DEBUG,
29            LogLevels::Trace => LevelFilter::TRACE,
30        }
31    }
32}
33
34/// Setup logging with tracing in Glog format for CLI
35pub fn setup_logging(log_filter_level: LevelFilter) {
36    let fmt = fmt::Layer::default()
37        .with_writer(std::io::stderr)
38        .with_ansi(stderr().is_terminal())
39        .event_format(Glog::default().with_timer(tracing_glog::LocalTime::default()))
40        .fmt_fields(GlogFields::default())
41        .with_filter(log_filter_level);
42
43    let subscriber = Registry::default().with(fmt);
44    tracing::subscriber::set_global_default(subscriber)
45        .expect("Unable to set global tracing subscriber");
46}