use std::path::Path;
use tracing::Subscriber;
use tracing_subscriber::{
self,
filter::EnvFilter,
fmt::{self, writer::MakeWriterExt},
layer::SubscriberExt,
Layer, Registry,
};
pub fn get_log_subscriber(
env_filter_str: String,
directory: impl AsRef<Path>,
file_name_prefix: impl AsRef<Path>,
) -> impl Subscriber + Send + Sync
{
println!("{env_filter_str}");
let env_filter = EnvFilter::try_from_default_env()
.unwrap_or_else(|_| EnvFilter::new(env_filter_str.clone()));
let offset = time::UtcOffset::from_hms(8, 0, 0).unwrap_or(time::UtcOffset::UTC);
let logger_time = fmt::time::OffsetTime::new(
offset,
time::macros::format_description!("[year]-[month]-[day] [hour]:[minute]:[second]"),
);
let file_appender = tracing_appender::rolling::daily(directory, file_name_prefix);
let console_file = std::io::stdout.with_max_level(tracing::Level::TRACE);
let console_layer = fmt::layer()
.json()
.with_ansi(false)
.with_file(true)
.pretty()
.with_timer(logger_time.clone())
.with_writer(console_file.and(file_appender))
.with_filter(env_filter);
let subscriber = Registry::default().with(console_layer);
subscriber
}
pub fn log_init_subscriber(subscriber: impl Subscriber + Send + Sync) {
tracing::subscriber::set_global_default(subscriber).expect("Failed to set subacriber");
}
pub fn config_default_log() {
let mut log_level = "info".to_string();
if cfg!(debug_assertions) {
log_level = "debug".into();
}
log_init_subscriber(get_log_subscriber(log_level, "./logs", "tan_middleware.log"));
}
pub fn spawn_blocking_with_tracing<F, R>(f: F) -> tokio::task::JoinHandle<R>
where
F: FnOnce() -> R + Send + 'static,
R: Send + 'static,
{
let current_span = tracing::Span::current();
tokio::task::spawn_blocking(move || {
current_span.in_scope(f)
})
}