2023-07-05 12:57:09 +00:00
|
|
|
use std::sync::RwLock;
|
|
|
|
|
2023-11-05 06:00:24 +00:00
|
|
|
use chrono::Local;
|
2021-11-03 07:28:34 +00:00
|
|
|
use lazy_static::lazy_static;
|
2022-12-09 01:19:47 +00:00
|
|
|
use tracing::subscriber::set_global_default;
|
2021-11-03 07:28:34 +00:00
|
|
|
use tracing_appender::{non_blocking::WorkerGuard, rolling::RollingFileAppender};
|
2023-07-14 05:37:13 +00:00
|
|
|
use tracing_bunyan_formatter::JsonStorageLayer;
|
2023-11-05 06:00:24 +00:00
|
|
|
use tracing_subscriber::fmt::format::Writer;
|
2021-11-04 08:43:12 +00:00
|
|
|
use tracing_subscriber::{layer::SubscriberExt, EnvFilter};
|
2021-11-03 07:28:34 +00:00
|
|
|
|
2023-07-14 05:37:13 +00:00
|
|
|
use crate::layer::FlowyFormattingLayer;
|
|
|
|
|
2023-07-05 12:57:09 +00:00
|
|
|
mod layer;
|
2023-10-30 04:35:06 +00:00
|
|
|
|
2021-11-03 07:28:34 +00:00
|
|
|
lazy_static! {
|
2023-02-13 01:29:49 +00:00
|
|
|
static ref LOG_GUARD: RwLock<Option<WorkerGuard>> = RwLock::new(None);
|
2021-11-03 07:28:34 +00:00
|
|
|
}
|
2021-07-03 06:14:10 +00:00
|
|
|
|
2021-08-19 06:08:24 +00:00
|
|
|
pub struct Builder {
|
2023-02-13 01:29:49 +00:00
|
|
|
#[allow(dead_code)]
|
|
|
|
name: String,
|
|
|
|
env_filter: String,
|
|
|
|
file_appender: RollingFileAppender,
|
2021-07-03 06:14:10 +00:00
|
|
|
}
|
|
|
|
|
2021-08-19 06:08:24 +00:00
|
|
|
impl Builder {
|
2023-02-13 01:29:49 +00:00
|
|
|
pub fn new(name: &str, directory: &str) -> Self {
|
|
|
|
Builder {
|
|
|
|
name: name.to_owned(),
|
|
|
|
env_filter: "Info".to_owned(),
|
2023-11-20 12:54:47 +00:00
|
|
|
file_appender: tracing_appender::rolling::daily(directory, name),
|
2021-07-03 06:14:10 +00:00
|
|
|
}
|
2023-02-13 01:29:49 +00:00
|
|
|
}
|
2021-07-03 06:14:10 +00:00
|
|
|
|
2023-02-13 01:29:49 +00:00
|
|
|
pub fn env_filter(mut self, env_filter: &str) -> Self {
|
|
|
|
self.env_filter = env_filter.to_owned();
|
|
|
|
self
|
|
|
|
}
|
2021-07-03 06:14:10 +00:00
|
|
|
|
2023-02-13 01:29:49 +00:00
|
|
|
pub fn build(self) -> std::result::Result<(), String> {
|
|
|
|
let env_filter = EnvFilter::new(self.env_filter);
|
2021-11-04 04:47:41 +00:00
|
|
|
|
2023-07-14 05:37:13 +00:00
|
|
|
let (non_blocking, guard) = tracing_appender::non_blocking(self.file_appender);
|
2023-02-13 01:29:49 +00:00
|
|
|
let subscriber = tracing_subscriber::fmt()
|
2023-11-05 06:00:24 +00:00
|
|
|
.with_timer(CustomTime)
|
2023-05-28 14:54:03 +00:00
|
|
|
.with_ansi(true)
|
2023-11-05 06:00:24 +00:00
|
|
|
.with_target(false)
|
2023-05-28 14:54:03 +00:00
|
|
|
.with_max_level(tracing::Level::TRACE)
|
2023-10-30 04:35:06 +00:00
|
|
|
.with_thread_ids(false)
|
2023-12-01 03:17:49 +00:00
|
|
|
.with_writer(std::io::stderr)
|
2023-10-30 04:35:06 +00:00
|
|
|
.pretty()
|
|
|
|
.with_env_filter(env_filter)
|
2023-05-28 14:54:03 +00:00
|
|
|
.finish()
|
2023-07-14 05:37:13 +00:00
|
|
|
.with(JsonStorageLayer)
|
|
|
|
.with(FlowyFormattingLayer::new(non_blocking));
|
2021-09-13 05:05:46 +00:00
|
|
|
|
2023-02-13 01:29:49 +00:00
|
|
|
set_global_default(subscriber).map_err(|e| format!("{:?}", e))?;
|
2023-11-05 06:00:24 +00:00
|
|
|
|
2023-02-13 01:29:49 +00:00
|
|
|
*LOG_GUARD.write().unwrap() = Some(guard);
|
|
|
|
Ok(())
|
|
|
|
}
|
2021-07-03 06:14:10 +00:00
|
|
|
}
|
2023-11-05 06:00:24 +00:00
|
|
|
|
|
|
|
struct CustomTime;
|
|
|
|
impl tracing_subscriber::fmt::time::FormatTime for CustomTime {
|
|
|
|
fn format_time(&self, w: &mut Writer<'_>) -> std::fmt::Result {
|
|
|
|
write!(w, "{}", Local::now().format("%Y-%m-%d %H:%M:%S"))
|
|
|
|
}
|
|
|
|
}
|