use runar_common::logging::Component;
use std::collections::HashMap;
#[derive(Clone, Debug)]
pub struct LoggingConfig {
pub default_level: LogLevel,
pub component_levels: HashMap<ComponentKey, LogLevel>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub enum ComponentKey {
Node,
Registry,
Service,
Database,
Network,
System,
Custom(String),
}
impl From<Component> for ComponentKey {
fn from(component: Component) -> Self {
match component {
Component::Node => ComponentKey::Node,
Component::Registry => ComponentKey::Registry,
Component::Service => ComponentKey::Service,
Component::Database => ComponentKey::Database,
Component::Transporter => ComponentKey::Network,
Component::System => ComponentKey::System,
Component::NetworkDiscovery => ComponentKey::Network,
Component::Custom(name) => ComponentKey::Custom(name.to_string()),
Component::CLI => ComponentKey::Custom("CLI".to_string()),
Component::Keys => ComponentKey::Custom("Keys".to_string()),
}
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum LogLevel {
Error,
Warn,
Info,
Debug,
Trace,
Off,
}
impl LogLevel {
pub fn to_level_filter(&self) -> log::LevelFilter {
match self {
LogLevel::Error => log::LevelFilter::Error,
LogLevel::Warn => log::LevelFilter::Warn,
LogLevel::Info => log::LevelFilter::Info,
LogLevel::Debug => log::LevelFilter::Debug,
LogLevel::Trace => log::LevelFilter::Trace,
LogLevel::Off => log::LevelFilter::Off,
}
}
}
impl Default for LoggingConfig {
fn default() -> Self {
Self::new()
}
}
impl LoggingConfig {
pub fn new() -> Self {
Self {
default_level: LogLevel::Error,
component_levels: HashMap::new(),
}
}
pub fn default_info() -> Self {
Self::new()
}
pub fn with_default_level(mut self, level: LogLevel) -> Self {
self.default_level = level;
self
}
pub fn with_component_level(mut self, component: Component, level: LogLevel) -> Self {
self.component_levels.insert(component.into(), level);
self
}
pub fn apply(&self) {
let mut builder = env_logger::Builder::new();
builder.parse_default_env();
builder.filter_level(self.default_level.to_level_filter());
for (component, level) in &self.component_levels {
let target = match component {
ComponentKey::Node => "runar_node",
ComponentKey::Registry => "runar_node::services::registry",
ComponentKey::Service => "runar_node::services",
ComponentKey::Database => "runar_node::database",
ComponentKey::Network => "runar_node::network",
ComponentKey::System => "runar_node::system",
ComponentKey::Custom(name) => name,
};
builder.filter(Some(target), level.to_level_filter());
}
builder.filter(Some("quinn"), LogLevel::Info.to_level_filter());
let _ = builder.try_init();
}
}