diff --git a/Cargo.lock b/Cargo.lock index 77e2af2..4d002bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1144,6 +1144,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + [[package]] name = "object" version = "0.32.2" @@ -2038,7 +2047,9 @@ checksum = "fe80ced77cbfb4cb91a94bf72b378b4b6791a0d9b7f09d0be747d1bdff4e68bd" dependencies = [ "deranged", "itoa", + "libc", "num-conv", + "num_threads", "powerfmt", "serde", "time-core", @@ -2241,6 +2252,16 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-serde" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +dependencies = [ + "serde", + "tracing-core", +] + [[package]] name = "tracing-subscriber" version = "0.3.18" @@ -2251,12 +2272,16 @@ dependencies = [ "nu-ansi-term", "once_cell", "regex", + "serde", + "serde_json", "sharded-slab", "smallvec", "thread_local", + "time", "tracing", "tracing-core", "tracing-log", + "tracing-serde", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 1782b92..f170e20 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,4 +18,4 @@ tokio = { version = "1.35.1", features = ["full"] } tower-http = { version = "0.5.1", features = ["trace"] } tracing = "0.1.40" tracing-appender = "0.2.3" -tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } +tracing-subscriber = { version = "0.3.18", features = ["env-filter", "json", "time", "local-time"] } diff --git a/src/main.rs b/src/main.rs index 61ac261..fb406cd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,31 +7,46 @@ use tokio::signal; use tower_http::trace::{DefaultMakeSpan, DefaultOnResponse, TraceLayer}; use tracing::Level; use tracing_appender::{non_blocking, rolling}; +use tracing_appender::non_blocking::WorkerGuard; use tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt}; +use tracing_subscriber::fmt::time::LocalTime; use axum_sqlx::{config::AppConfig, handler, model::state::AppState}; +fn init_trace_logger_by_no_blocking() -> WorkerGuard { + // 设置日志级别 根据RUST_LOG + let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")); + + let timer = LocalTime::rfc_3339(); + + // 输出到文件中(按天分割) + let file_appender = rolling::daily("logs", "app.log"); + // 非阻塞 _guard释放会导致文件记录失效 + let (non_blocking_appender, guard) = non_blocking(file_appender); + // 构建layer 文件输出 + let file_layer = fmt::layer() + .with_timer(timer.clone()) + .with_ansi(false) + .with_writer(non_blocking_appender); + // 构建layer 控制台打印 + let console_layer = fmt::layer().with_timer(timer); + + tracing_subscriber::registry() + .with(env_filter) + .with(console_layer) + .with(file_layer.json()) + .init(); + + return guard; +} + + #[tokio::main] async fn main() { // 解析 .env 文件 dotenvy::dotenv().expect("解析.env文件失败"); - // 设置日志级别 根据RUST_LOG - let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")); - // 输出到文件中(按天分割) - let file_appender = rolling::daily("logs", "app.log"); - // 非阻塞 _guard释放会导致文件记录失效 - let (non_blocking_appender, _guard) = non_blocking(file_appender); - // 构建layer - let file_layer = fmt::layer() - .with_ansi(false) - .with_writer(non_blocking_appender); - - tracing_subscriber::registry() - .with(env_filter) - .with(fmt::layer()) - .with(file_layer) - .init(); + let _guard = init_trace_logger_by_no_blocking(); let cfg = AppConfig::new() .map_err(|e| tracing::error!("初始化配置失败:{}", e.to_string()))