1use time::macros::format_description;
2use time::UtcOffset;
3use tracing_appender::non_blocking::WorkerGuard;
4use tracing_appender::{non_blocking, rolling};
5use tracing_error::ErrorLayer;
6use tracing_subscriber::filter::LevelFilter;
7use tracing_subscriber::fmt::time::OffsetTime;
8use tracing_subscriber::util::SubscriberInitExt;
9use tracing_subscriber::{fmt, layer::SubscriberExt, prelude::*};
10use tracing_subscriber::{Layer, Registry};
11
12static mut _WORKER_GUARD: Option<WorkerGuard> = None;
13
14pub fn configure(level: LevelFilter, bucket_path: String, app_name: String) {
15 let local_time = OffsetTime::new(
16 UtcOffset::from_hms(8, 0, 0).unwrap_or(UtcOffset::UTC),
17 format_description!("[year]-[month]-[day] [hour]:[minute]:[second].[subsecond digits:3]"),
18 );
19 let console_layer = fmt::layer()
20 .pretty()
21 .with_timer(local_time.clone())
22 .with_writer(std::io::stdout)
23 .with_filter(level);
24
25 let file_appender = rolling::daily(format!("{}/log/", bucket_path), format!("{}.log", app_name));
26 let (non_blocking_appender, _guard) = non_blocking(file_appender);
27 unsafe {
28 _WORKER_GUARD = Some(_guard);
29 }
30
31 let file_layer = fmt::layer()
32 .with_timer(local_time.clone())
33 .with_ansi(false)
34 .with_writer(non_blocking_appender)
35 .with_filter(LevelFilter::INFO);
36
37 Registry::default()
38 .with(ErrorLayer::default())
39 .with(console_layer)
40 .with(file_layer)
41 .init();
42}