use tracing_appender::non_blocking::WorkerGuard;
use tracing_appender::rolling;
use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt, EnvFilter};
pub struct LogUtil;
impl LogUtil {
pub fn init(directory: &str, file_name_prefix: &str, level: &str) -> WorkerGuard {
let file_appender = rolling::daily(directory, file_name_prefix);
let (non_blocking, guard) = tracing_appender::non_blocking(file_appender); let file_timer = fmt::time::ChronoLocal::new("%Y-%m-%dT%H:%M:%S.%f%Z".to_string());
let console_timer = fmt::time::ChronoLocal::new("%Y-%m-%dT%H:%M:%S.%f%Z".to_string());
let file_layer = fmt::layer()
.with_writer(non_blocking)
.with_ansi(false)
.with_timer(file_timer)
.with_level(true)
.with_target(true)
.with_line_number(true)
.with_thread_names(true);
let console_layer = fmt::layer()
.with_ansi(true) .with_level(true)
.with_timer(console_timer)
.with_target(true)
.with_line_number(true);
let env_filter = EnvFilter::try_from_default_env()
.unwrap_or_else(|_| EnvFilter::new(level));
tracing_subscriber::registry()
.with(env_filter)
.with(console_layer)
.with(file_layer)
.init();
guard
}
}
#[cfg(test)]
mod tests {
use super::*;
use tracing::{error, info, warn};
#[test]
fn it_works() {
let _guard = LogUtil::init("./logs", "app.log", "info");
info!("info msg1");
error!("error msg1");
warn!("warn msg1");
}
}