diff --git a/.gitignore b/.gitignore index ea8c4bf..791af9f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +/logs diff --git a/Cargo.lock b/Cargo.lock index c6775c9..fb669da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -220,6 +220,7 @@ dependencies = [ "sqlx", "tokio", "tracing", + "tracing-appender", "tracing-subscriber", ] @@ -392,6 +393,15 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +[[package]] +name = "crossbeam-channel" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-queue" version = "0.3.11" @@ -428,6 +438,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + [[package]] name = "digest" version = "0.10.7" @@ -1077,6 +1096,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-integer" version = "0.1.45" @@ -1303,6 +1328,12 @@ version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -1998,6 +2029,37 @@ dependencies = [ "once_cell", ] +[[package]] +name = "time" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe80ced77cbfb4cb91a94bf72b378b4b6791a0d9b7f09d0be747d1bdff4e68bd" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +dependencies = [ + "num-conv", + "time-core", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -2117,6 +2179,18 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror", + "time", + "tracing-subscriber", +] + [[package]] name = "tracing-attributes" version = "0.1.27" diff --git a/Cargo.toml b/Cargo.toml index bd1be6e..edcd8e7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,4 +16,5 @@ serde_json = "1.0.113" sqlx = { version = "0.7.3", features = ["mysql", "runtime-tokio", "tls-rustls", "chrono", "macros"] } tokio = { version = "1.35.1", features = ["full"] } tracing = "0.1.40" +tracing-appender = "0.2.3" tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } diff --git a/src/main.rs b/src/main.rs index e75a8f7..c5873e6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,15 +4,38 @@ use axum::Router; use axum::routing::get; use sqlx::mysql::MySqlPoolOptions; use tokio::signal; +use tracing_appender::{rolling, non_blocking}; +use tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt}; use axum_sqlx::{config::AppConfig, handler, model::state::AppState}; + +fn init_tracing_logger() { + // 设置日志级别 根据RUST_LOG + let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")); + // 输出到文件中(按天分割) + let file_appender = rolling::daily("logs", "app.log"); + // 非阻塞 + 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(); +} + + #[tokio::main] async fn main() { // 解析 .env 文件 dotenvy::dotenv().expect("解析.env文件失败"); - tracing_subscriber::fmt::init(); + init_tracing_logger(); let cfg = AppConfig::new() .map_err(|e| tracing::error!("初始化配置失败:{}", e.to_string()))