subgraph/utils/logger/
mod.rs

1use env_logger::Env;
2use log::Level;
3use serde::{Deserialize, Serialize};
4use std::io::Write;
5use std::{fmt, str::FromStr};
6
7use crate::{cli_args::CliArgs, configuration::subgraph::SubGraphConfig};
8
9#[derive(Debug, Serialize, Deserialize, Clone)]
10#[serde(rename_all = "lowercase")]
11pub enum LogLevelEnum {
12    Error,
13    Warn,
14    Info,
15    Debug,
16    Trace,
17}
18
19impl fmt::Display for LogLevelEnum {
20    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
21        let variant_str = match self {
22            LogLevelEnum::Error => "error",
23            LogLevelEnum::Warn => "warn",
24            LogLevelEnum::Info => "info",
25            LogLevelEnum::Debug => "debug",
26            LogLevelEnum::Trace => "trace",
27        };
28        write!(f, "{}", variant_str)
29    }
30}
31
32impl LogLevelEnum {
33    pub fn parse_log_level(log_level_enum: LogLevelEnum) -> Level {
34        match log_level_enum {
35            LogLevelEnum::Error => Level::Error,
36            LogLevelEnum::Warn => Level::Warn,
37            LogLevelEnum::Info => Level::Info,
38            LogLevelEnum::Debug => Level::Debug,
39            LogLevelEnum::Trace => Level::Trace,
40        }
41    }
42}
43
44pub struct Logger;
45impl Logger {
46    pub fn init(args: &CliArgs, subgraph_config: &SubGraphConfig) {
47        let log_level = match args.log_level.clone() {
48            Some(level) => {
49                let level_from_str = Level::from_str(&level);
50                match level_from_str {
51                    Ok(level) => level,
52                    Err(_) => panic!("Failed to get log level from args."),
53                }
54            }
55            None => match subgraph_config.clone().service.log_level {
56                Some(level) => LogLevelEnum::parse_log_level(level),
57                None => Level::Info,
58            },
59        };
60
61        env_logger::Builder::from_env(Env::default().default_filter_or(log_level.to_string()))
62            .format(|buf, record| {
63                // Define color codes
64                let color = match record.level() {
65                    log::Level::Error => "\x1b[31m", // Red
66                    log::Level::Warn => "\x1b[33m",  // Yellow
67                    log::Level::Info => "\x1b[32m",  // Green
68                    log::Level::Debug => "\x1b[34m", // Blue
69                    log::Level::Trace => "\x1b[36m", // Cyan
70                };
71
72                // Reset color at the end
73                let reset_color = "\x1b[0m";
74
75                // Write the log message with color
76                writeln!(
77                    buf,
78                    "{}[{}]{} {}{}",
79                    color,
80                    record.level(),
81                    reset_color,
82                    record.args(),
83                    reset_color
84                )
85            })
86            .init();
87    }
88}