rust_cutil/cutil/
log.rs

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}