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#[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
34pub 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}