use crate::arg::get_arg;
use std::time::Duration;
use crate::serdejson::JsonVExentd;
use crate::string::StringExentd;
use fast_log::appender::{FastLogRecord, LogAppender, RecordFormat};
use fast_log::consts::LogSize;
use fast_log::plugin::console::ConsoleAppender;
use fast_log::plugin::file_split::FileSplitAppender;
use log::LevelFilter;
#[test]
fn test_log() {
let _watch = crate::toml_read::run_watch("./config/default.toml").unwrap();
crate::mylog::init_log("log-test".to_string());
info!("this is log11111111111");
debug!(r##"this is log22222222222222"##);
debug!(r##"this is log3333333333333333"##);
debug!(r##"this is log44444444444444"##);
info!(r##"this is log55555555555555555"##);
crate::time::sleep_rand(12000, 13001);
}
static LOG_INIT: once_cell::sync::OnceCell<String> = once_cell::sync::OnceCell::new();
pub fn init_log(log_name: impl Into<String>) {
let log_name = log_name.into();
let _ = LOG_INIT.get_or_init(|| {
init_log2(log_name.clone());
log_name
});
}
fn init_log2(file_name: String) {
pub struct MailAppender {}
impl LogAppender for MailAppender {
fn do_logs(&self, records: &[FastLogRecord]) {
if log::Level::Error == records[0].level {
#[cfg(feature = "use_mail")]
if let Err(e) = crate::mail::send(&records[0].formated) {
eprintln!("MailAppender Error: {:?}", e);
}
}
}
}
let file_name = file_name.as_str();
let appenders_config = {
let appenders = get_arg("log.appenders");
let r = if let Some(s) = appenders.as_str() {
s.replace(';', ",")
} else if let Some(arr) = appenders.as_array() {
let mut s = String::new();
for x in arr {
s.push_str(",");
s.push_str(x.as_str().unwrap_or_default());
}
s
} else {
appenders.to_string()
};
let r = r.trim().trim_start_matches(",").trim_end_matches(",").trim().to_string();
if r.trim() == "" {
"console".to_owned()
} else {
r
}
};
let level_str = get_arg("log.level").as_string2().unwrap_or("info".to_owned());
let level = match level_str.to_lowercase().trim() {
"trace" => LevelFilter::Trace,
"debug" => LevelFilter::Debug,
"info" => LevelFilter::Info,
"warn" => LevelFilter::Warn,
"error" => LevelFilter::Error,
_ => LevelFilter::Info,
};
let mut config = fast_log::config::Config::new().level(level);
let mut filters = vec![];
let filters_input = get_arg("log.filters");
if let Some(filters_input) = filters_input.as_array() {
for x in filters_input {
filters.push(x.as_str().unwrap_or_default().replace('-', "_"));
}
}
if !filters.is_empty() {
config = config.filter(fast_log::filter::ModuleFilter::new_include(filters));
}
std::env::set_var("RUST_LOG", level_str);
let storage_size = get_arg("log.storage_size").as_u64().unwrap_or_else(|| 25);
if appenders_config.contains("file") {
config = config.custom(FileSplitAppender::new(
&format!("logs-{}/", file_name),
LogSize::MB(storage_size as usize),
fast_log::plugin::file_split::RollingType::KeepTime(Duration::from_secs(24_u64 * 3600)),
Box::new(fast_log::plugin::packer::LogPacker {}),
));
}
if appenders_config.contains("mail") {
config = config.custom(MailAppender {});
}
if appenders_config.contains("console") {
config = config.custom(ConsoleAppender {});
}
pub struct MyFormat {}
impl RecordFormat for MyFormat {
fn do_format(&self, arg: &mut FastLogRecord) {
let line = arg.line.map(|v| v.to_string()).unwrap_or_default();
let now = chrono::DateTime::<chrono::Local>::from(arg.now);
let now = format!("{:26}", now.to_string()).sub_string(0, 26);
arg.formated = format!(
"[{now}] {level} [{module_path}:{line}] {formated} {args}\n",
now = now,
module_path = arg.file,
line = line,
level = arg.level,
formated = arg.formated.trim_start_matches("(").trim_end_matches(")"),
args = arg.args,
);
}
}
config = config.format(MyFormat {});
fast_log::init(config).unwrap();
}