88 lines
3.1 KiB
Rust
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");
|
|
}
|