use std::path::PathBuf;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum LogLevel {
Error = 1,
Warning = 2,
Info = 3,
Debug = 4,
Trace = 5,
}
impl LogLevel {
pub fn as_str(&self) -> &'static str {
match self {
LogLevel::Error => "ERROR",
LogLevel::Warning => "WARNING",
LogLevel::Info => "INFO",
LogLevel::Debug => "DEBUG",
LogLevel::Trace => "TRACE",
}
}
pub fn should_log(&self, configured_level: LogLevel) -> bool {
*self <= configured_level
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum Pattern {
Basic,
Detailed,
Extended,
Json,
Custom(String),
}
impl Pattern {
pub fn default() -> Self {
Pattern::Basic
}
pub fn validate_custom(pattern: &str) -> bool {
pattern.contains("{message}")
}
pub fn format(&self, info: &crate::format::LogInfo) -> String {
use crate::format::{format_basic, format_detailed};
match self {
Pattern::Basic => format_basic(info),
Pattern::Detailed => format_detailed(info),
Pattern::Extended => format_detailed(info),
Pattern::Json => format_basic(info),
Pattern::Custom(_) => format_basic(info),
}
}
}
#[derive(Debug, Clone)]
pub struct LoggerConfig {
pub pattern: Pattern,
pub file_path: PathBuf,
pub file_name: String,
pub log_level: Option<LogLevel>,
pub max_file_size: u64,
pub max_backup_files: u32,
}
impl LoggerConfig {
pub fn basic(
pattern: Pattern,
file_path: PathBuf,
file_name: String,
) -> Self {
Self {
pattern,
file_path,
file_name,
log_level: None,
max_file_size: 10 * 1024 * 1024,
max_backup_files: 5,
}
}
pub fn with_level(
pattern: Pattern,
file_path: PathBuf,
file_name: String,
log_level: LogLevel,
) -> Self {
Self {
pattern,
file_path,
file_name,
log_level: Some(log_level),
max_file_size: 10 * 1024 * 1024,
max_backup_files: 5,
}
}
pub fn with_rotation(
pattern: Pattern,
file_path: PathBuf,
file_name: String,
log_level: LogLevel,
max_file_size: u64,
max_backup_files: u32,
) -> Self {
Self {
pattern,
file_path,
file_name,
log_level: Some(log_level),
max_file_size,
max_backup_files,
}
}
pub fn get_log_file_path(&self) -> PathBuf {
self.file_path.join(format!("{}.log", self.file_name))
}
pub fn should_log_level(&self, level: LogLevel) -> bool {
match self.log_level {
Some(configured_level) => level.should_log(configured_level),
None => true,
}
}
}