From 5521b202a61a92f26b096aa1f82e2adb9a174e91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=A4=A9?= Date: Fri, 2 Feb 2024 17:58:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=9E=84=E5=BB=BA=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 2 +- Cargo.lock | 18 ++++++++++++++++++ Cargo.toml | 1 + src/main.rs | 32 ++++++++++++++++++-------------- 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/.env b/.env index bd70fbd..7db7232 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ # 日志级别 -RUST_LOG=DEBUG +RUST_LOG=INFO # 运行模式 RUN_MODE=dev diff --git a/Cargo.lock b/Cargo.lock index fb669da..77e2af2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -219,6 +219,7 @@ dependencies = [ "serde_json", "sqlx", "tokio", + "tower-http", "tracing", "tracing-appender", "tracing-subscriber", @@ -2155,6 +2156,23 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da193277a4e2c33e59e09b5861580c33dd0a637c3883d0fa74ba40c0374af2e" +dependencies = [ + "bitflags 2.4.2", + "bytes", + "http", + "http-body", + "http-body-util", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower-layer" version = "0.3.2" diff --git a/Cargo.toml b/Cargo.toml index edcd8e7..1782b92 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ serde = { version = "1.0.196", features = ["derive"] } 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"] } +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"] } diff --git a/src/main.rs b/src/main.rs index c5873e6..61ac261 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,18 +4,23 @@ use axum::Router; use axum::routing::get; use sqlx::mysql::MySqlPoolOptions; use tokio::signal; -use tracing_appender::{rolling, non_blocking}; +use tower_http::trace::{DefaultMakeSpan, DefaultOnResponse, TraceLayer}; +use tracing::Level; +use tracing_appender::{non_blocking, rolling}; use tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt}; use axum_sqlx::{config::AppConfig, handler, model::state::AppState}; +#[tokio::main] +async fn main() { + // 解析 .env 文件 + dotenvy::dotenv().expect("解析.env文件失败"); -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"); - // 非阻塞 + // 非阻塞 _guard释放会导致文件记录失效 let (non_blocking_appender, _guard) = non_blocking(file_appender); // 构建layer let file_layer = fmt::layer() @@ -27,15 +32,6 @@ fn init_tracing_logger() { .with(fmt::layer()) .with(file_layer) .init(); -} - - -#[tokio::main] -async fn main() { - // 解析 .env 文件 - dotenvy::dotenv().expect("解析.env文件失败"); - - init_tracing_logger(); let cfg = AppConfig::new() .map_err(|e| tracing::error!("初始化配置失败:{}", e.to_string())) @@ -48,6 +44,13 @@ async fn main() { .map_err(|e| tracing::error!("数据库连接失败:{}", e.to_string())) .unwrap(); + // 默认TraceLayer的打印级别为DEBUG,设置response的打印级别为INFO,这样可以避免过多的打印日志 + // 利用make_span_with来显示span中的其他信息 + let trace_layer = TraceLayer::new_for_http() + // TODO span的request写到日志会乱码 不知道怎么解决,with_ansi为什么不起作用 + .make_span_with(DefaultMakeSpan::new().level(Level::INFO)) + .on_response(DefaultOnResponse::new().level(Level::INFO)); + let app = Router::new() .route("/", get(handler::index)) .route("/detail/:id", get(handler::detail)) @@ -56,6 +59,7 @@ async fn main() { .route("/del/:id", get(handler::del)) .route("/real_del/:id", get(handler::real_del)) .route("/tran", get(handler::tran_ui).post(handler::tran)) + .layer(trace_layer) .with_state(AppState { pool: Arc::new(pool) }); @@ -76,14 +80,14 @@ async fn shutdown_signal() { }; #[cfg(unix)] - let terminate = async { + let terminate = async { signal::unix::signal(signal::unix::SignalKind::terminate()) .expect("failed to install signal handler") .recv() .await; }; #[cfg(not(unix))] - let terminate = std::future::pending::<()>(); + let terminate = std::future::pending::<()>(); tokio::select! { _ = ctrl_c => {}, _ = terminate => {},