#![allow(dead_code)]
use std::path::{Path, PathBuf};
use log::*;
use simplelog::*;
use time::format_description;
use crate::{error::DepuraResult as Result, logger::MultiLogger};
#[derive(Clone, Debug)]
pub struct Logger {
pub(crate) name: String,
pub(crate) file_path: Option<PathBuf>,
pub(crate) file_append: bool,
pub(crate) file_truncate: bool,
pub(crate) file_create: bool,
pub(crate) level: LevelFilter,
pub(crate) target_level: LevelFilter,
pub(crate) allowed: Vec<&'static str>,
pub(crate) ignored: Vec<&'static str>,
pub(crate) config: ConfigBuilder,
pub(crate) datetime_fmt: Vec<FormatItem<'static>>,
}
impl Default for Logger {
fn default() -> Self {
Self {
name: String::new(),
file_path: None,
file_append: true,
file_truncate: true,
file_create: true,
level: LevelFilter::max(), target_level: LevelFilter::Off,
allowed: vec![],
ignored: vec![],
config: default_config(),
datetime_fmt: format_description::parse(Logger::DATETIME_FMT).unwrap(),
}
}
}
fn default_config() -> ConfigBuilder {
ConfigBuilder::new()
.set_time_level(LevelFilter::Error) .set_max_level(LevelFilter::Error) .set_thread_level(LevelFilter::Off) .set_target_level(LevelFilter::Off) .set_location_level(LevelFilter::Off) .set_time_format_custom(format_description!(
"[hour]:[minute]:[second].[subsecond digits:5]" ))
.set_time_offset_to_local()
.expect("couldn't set local offset")
.set_thread_mode(ThreadLogMode::Both)
.set_level_padding(LevelPadding::Right)
.clone()
}
impl Logger {
pub const DATETIME_FMT: &'static str = "[year]-[month]-[day]_[hour]:[minute]:[second].[subsecond digits:4]_[offset_hour sign:mandatory]:[offset_minute]";
}
impl Logger {
pub fn new(name: &str) -> Self {
Self::default().name(name)
}
pub fn name(mut self, name: &str) -> Self {
self.name = name.into();
self
}
pub fn level(mut self, level: LevelFilter) -> Self {
self.level = level;
self
}
pub fn level_off(mut self) -> Self {
self.level = LevelFilter::Off;
self
}
pub fn level_error(mut self) -> Self {
self.level = LevelFilter::Error;
self
}
pub fn level_warn(mut self) -> Self {
self.level = LevelFilter::Warn;
self
}
pub fn level_info(mut self) -> Self {
self.level = LevelFilter::Info;
self
}
pub fn level_debug(mut self) -> Self {
self.level = LevelFilter::Debug;
self
}
pub fn level_trace(mut self) -> Self {
self.level = LevelFilter::Trace;
self
}
pub fn target_level(mut self, target_level: LevelFilter) -> Self {
self.target_level = target_level;
self
}
pub fn target_level_off(mut self) -> Self {
self.target_level = LevelFilter::Off;
self
}
pub fn target_level_all(mut self) -> Self {
self.target_level = LevelFilter::Error;
self
}
pub fn target_level_error(mut self) -> Self {
self.target_level = LevelFilter::Error;
self
}
pub fn target_level_warn(mut self) -> Self {
self.target_level = LevelFilter::Warn;
self
}
pub fn target_level_info(mut self) -> Self {
self.target_level = LevelFilter::Info;
self
}
pub fn target_level_debug(mut self) -> Self {
self.target_level = LevelFilter::Debug;
self
}
pub fn target_level_trace(mut self) -> Self {
self.target_level = LevelFilter::Trace;
self
}
pub fn file(mut self, path: impl AsRef<Path>) -> Self {
self.file_path = Some(path.as_ref().to_path_buf());
self
}
pub fn unset_file(mut self) -> Self {
self.file_path = None;
self
}
pub fn append(mut self, append: bool) -> Self {
self.file_append = append;
self
}
pub fn truncate(mut self, truncate: bool) -> Self {
self.file_truncate = truncate;
self
}
pub fn allow(mut self, allow: &'static str) -> Self {
self.allowed.push(allow);
self
}
pub fn ignore(mut self, ignore: &'static str) -> Self {
self.ignored.push(ignore);
self
}
pub fn init(self) -> Result<()> {
MultiLogger::new().include(self).init()
}
}