dynip-cloudflare/src/logging.rs

88 lines
3.1 KiB
Rust

use chrono::Local;
use colored::*;
use log::LevelFilter;
use log4rs::append::console::{ConsoleAppender, Target};
use log4rs::append::rolling_file::policy::compound::roll::fixed_window::FixedWindowRoller;
use log4rs::append::rolling_file::policy::compound::trigger::size::SizeTrigger;
use log4rs::append::rolling_file::policy::compound::CompoundPolicy;
use log4rs::config::{Appender, Config, Root};
use log4rs::encode::pattern::PatternEncoder;
use log4rs::encode::{self, Encode};
use log4rs::filter::threshold::ThresholdFilter;
use crate::{LOG_DIR, PROGRAM_NAME};
#[derive(Debug)]
struct ColoredPatternEncoder;
impl ColoredPatternEncoder {
pub fn new() -> Self {
ColoredPatternEncoder {}
}
}
impl Encode for ColoredPatternEncoder {
fn encode(&self, w: &mut dyn encode::Write, record: &log::Record) -> anyhow::Result<()> {
let now = Local::now().format("%Y-%m-%d %H:%M:%S").to_string();
let level = match record.level() {
log::Level::Error => record.level().to_string().red().bold(),
log::Level::Warn => record.level().to_string().yellow().bold(),
log::Level::Info => record.level().to_string().green().bold(),
log::Level::Debug => record.level().to_string().blue().bold(),
log::Level::Trace => record.level().to_string().purple().bold(),
};
let message = record.args().to_string().cyan();
Ok(writeln!(w, "{} [{}] {}", now.bold(), level, message)?)
}
}
pub fn init_logger() {
let today = Local::now().format("%Y-%m-%d").to_string();
if std::fs::metadata(LOG_DIR).is_err() {
std::fs::create_dir(LOG_DIR).expect("Failed to create log dir");
}
let log_file_path = format!("{}/{}-{}.log", LOG_DIR, PROGRAM_NAME, today);
let log_file_pattern = format!("{}/{}-{}-{{}}.log", LOG_DIR, PROGRAM_NAME, today);
let level = log::LevelFilter::Info;
let stderr = ConsoleAppender::builder()
.encoder(Box::new(ColoredPatternEncoder::new()))
.target(Target::Stderr)
.build();
const TRIGGER_FILE_SIZE: u64 = 5 * 1024; // 5KB as max log file size to roll
let trigger = SizeTrigger::new(TRIGGER_FILE_SIZE);
let roller = FixedWindowRoller::builder()
.base(0)
.build(&log_file_pattern, 3)
.unwrap();
let policy = CompoundPolicy::new(Box::new(trigger), Box::new(roller));
let logfile = log4rs::append::rolling_file::RollingFileAppender::builder()
.encoder(Box::new(PatternEncoder::new(
"{d(%Y-%m-%d %H:%M:%S)} [{l}] {m}\n",
)))
.build(log_file_path, Box::new(policy))
.unwrap();
let config = Config::builder()
.appender(Appender::builder().build("logfile", Box::new(logfile)))
.appender(
Appender::builder()
.filter(Box::new(ThresholdFilter::new(level)))
.build("stderr", Box::new(stderr)),
)
.build(
Root::builder()
.appender("logfile")
.appender("stderr")
.build(LevelFilter::Trace),
)
.unwrap();
log4rs::init_config(config).expect("Failed to initialize logger");
}