use crate::ufhg::lightning_hash_str;
use crate::utils::buggu_hash_set::BugguHashSet;
use std::fs;
use std::io;
#[derive(Debug, Clone)]
pub struct LogConfig {
pub max_postings: usize,
pub stale_secs: u64,
pub log_levels: BugguHashSet<u64, u8>,
pub services: BugguHashSet<u64, u8>,
pub enable_ngrams: bool,
pub max_ngram_size: usize,
pub enable_patterns: bool,
}
impl Default for LogConfig {
fn default() -> Self {
let mut log_levels = BugguHashSet::new(4096);
log_levels.insert(lightning_hash_str("TRACE"), 0);
log_levels.insert(lightning_hash_str("DEBUG"), 1);
log_levels.insert(lightning_hash_str("INFO"), 2);
log_levels.insert(lightning_hash_str("WARN"), 3);
log_levels.insert(lightning_hash_str("ERROR"), 4);
log_levels.insert(lightning_hash_str("FATAL"), 5);
Self {
max_postings: 32_000,
stale_secs: 3600, log_levels,
services: BugguHashSet::new(4096),
enable_ngrams: true,
max_ngram_size: 3,
enable_patterns: true,
}
}
}
impl LogConfig {
pub fn from_file(path: &str) -> io::Result<Self> {
let _content = fs::read_to_string(path)?;
Ok(Self::default())
}
pub fn log_level_priority(&self, level: &str) -> u8 {
let level_hash = lightning_hash_str(level);
self.log_levels.get(&level_hash).copied().unwrap_or(2) }
pub fn service_id(&self, service: &str) -> u8 {
let service_hash = lightning_hash_str(service);
self.services.get(&service_hash).copied().unwrap_or(0)
}
pub fn register_service(&mut self, service: &str) -> u8 {
let service_hash = lightning_hash_str(service);
if let Some(&existing_id) = self.services.get(&service_hash) {
return existing_id;
}
let new_id = self.services.len() as u8;
self.services.insert(service_hash, new_id);
new_id
}
pub fn should_index_level(&self, level: &str) -> bool {
let level_hash = lightning_hash_str(level);
self.log_levels.get(&level_hash).is_some()
}
pub fn log_level_hashes(&self) -> Vec<u64> {
self.log_levels.iter_keys().collect()
}
pub fn service_hashes(&self) -> Vec<u64> {
self.services.iter_keys().collect()
}
pub fn add_log_level(&mut self, level: &str, priority: u8) {
let level_hash = lightning_hash_str(level);
self.log_levels.insert(level_hash, priority);
}
pub fn has_log_level_priority(&self, priority: u8) -> bool {
self.log_levels
.iter_keys()
.any(|k| *self.log_levels.get(&k).unwrap() == priority)
}
pub fn stats(&self) -> String {
format!(
"LogConfig: levels {} services {} max_postings {} ngrams:{}",
self.log_levels.len(),
self.services.len(),
self.max_postings,
self.enable_ngrams
)
}
}