日志构建逻辑调整
This commit is contained in:
parent
2d8b593c4d
commit
5521b202a6
2
.env
2
.env
|
@ -1,5 +1,5 @@
|
||||||
# 日志级别
|
# 日志级别
|
||||||
RUST_LOG=DEBUG
|
RUST_LOG=INFO
|
||||||
|
|
||||||
# 运行模式
|
# 运行模式
|
||||||
RUN_MODE=dev
|
RUN_MODE=dev
|
||||||
|
|
|
@ -219,6 +219,7 @@ dependencies = [
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"sqlx",
|
"sqlx",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
"tower-http",
|
||||||
"tracing",
|
"tracing",
|
||||||
"tracing-appender",
|
"tracing-appender",
|
||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
|
@ -2155,6 +2156,23 @@ dependencies = [
|
||||||
"tracing",
|
"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]]
|
[[package]]
|
||||||
name = "tower-layer"
|
name = "tower-layer"
|
||||||
version = "0.3.2"
|
version = "0.3.2"
|
||||||
|
|
|
@ -15,6 +15,7 @@ serde = { version = "1.0.196", features = ["derive"] }
|
||||||
serde_json = "1.0.113"
|
serde_json = "1.0.113"
|
||||||
sqlx = { version = "0.7.3", features = ["mysql", "runtime-tokio", "tls-rustls", "chrono", "macros"] }
|
sqlx = { version = "0.7.3", features = ["mysql", "runtime-tokio", "tls-rustls", "chrono", "macros"] }
|
||||||
tokio = { version = "1.35.1", features = ["full"] }
|
tokio = { version = "1.35.1", features = ["full"] }
|
||||||
|
tower-http = { version = "0.5.1", features = ["trace"] }
|
||||||
tracing = "0.1.40"
|
tracing = "0.1.40"
|
||||||
tracing-appender = "0.2.3"
|
tracing-appender = "0.2.3"
|
||||||
tracing-subscriber = { version = "0.3.18", features = ["env-filter"] }
|
tracing-subscriber = { version = "0.3.18", features = ["env-filter"] }
|
||||||
|
|
32
src/main.rs
32
src/main.rs
|
@ -4,18 +4,23 @@ use axum::Router;
|
||||||
use axum::routing::get;
|
use axum::routing::get;
|
||||||
use sqlx::mysql::MySqlPoolOptions;
|
use sqlx::mysql::MySqlPoolOptions;
|
||||||
use tokio::signal;
|
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 tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt};
|
||||||
|
|
||||||
use axum_sqlx::{config::AppConfig, handler, model::state::AppState};
|
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
|
// 设置日志级别 根据RUST_LOG
|
||||||
let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));
|
let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));
|
||||||
// 输出到文件中(按天分割)
|
// 输出到文件中(按天分割)
|
||||||
let file_appender = rolling::daily("logs", "app.log");
|
let file_appender = rolling::daily("logs", "app.log");
|
||||||
// 非阻塞
|
// 非阻塞 _guard释放会导致文件记录失效
|
||||||
let (non_blocking_appender, _guard) = non_blocking(file_appender);
|
let (non_blocking_appender, _guard) = non_blocking(file_appender);
|
||||||
// 构建layer
|
// 构建layer
|
||||||
let file_layer = fmt::layer()
|
let file_layer = fmt::layer()
|
||||||
|
@ -27,15 +32,6 @@ fn init_tracing_logger() {
|
||||||
.with(fmt::layer())
|
.with(fmt::layer())
|
||||||
.with(file_layer)
|
.with(file_layer)
|
||||||
.init();
|
.init();
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#[tokio::main]
|
|
||||||
async fn main() {
|
|
||||||
// 解析 .env 文件
|
|
||||||
dotenvy::dotenv().expect("解析.env文件失败");
|
|
||||||
|
|
||||||
init_tracing_logger();
|
|
||||||
|
|
||||||
let cfg = AppConfig::new()
|
let cfg = AppConfig::new()
|
||||||
.map_err(|e| tracing::error!("初始化配置失败:{}", e.to_string()))
|
.map_err(|e| tracing::error!("初始化配置失败:{}", e.to_string()))
|
||||||
|
@ -48,6 +44,13 @@ async fn main() {
|
||||||
.map_err(|e| tracing::error!("数据库连接失败:{}", e.to_string()))
|
.map_err(|e| tracing::error!("数据库连接失败:{}", e.to_string()))
|
||||||
.unwrap();
|
.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()
|
let app = Router::new()
|
||||||
.route("/", get(handler::index))
|
.route("/", get(handler::index))
|
||||||
.route("/detail/:id", get(handler::detail))
|
.route("/detail/:id", get(handler::detail))
|
||||||
|
@ -56,6 +59,7 @@ async fn main() {
|
||||||
.route("/del/:id", get(handler::del))
|
.route("/del/:id", get(handler::del))
|
||||||
.route("/real_del/:id", get(handler::real_del))
|
.route("/real_del/:id", get(handler::real_del))
|
||||||
.route("/tran", get(handler::tran_ui).post(handler::tran))
|
.route("/tran", get(handler::tran_ui).post(handler::tran))
|
||||||
|
.layer(trace_layer)
|
||||||
.with_state(AppState {
|
.with_state(AppState {
|
||||||
pool: Arc::new(pool)
|
pool: Arc::new(pool)
|
||||||
});
|
});
|
||||||
|
@ -76,14 +80,14 @@ async fn shutdown_signal() {
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
let terminate = async {
|
let terminate = async {
|
||||||
signal::unix::signal(signal::unix::SignalKind::terminate())
|
signal::unix::signal(signal::unix::SignalKind::terminate())
|
||||||
.expect("failed to install signal handler")
|
.expect("failed to install signal handler")
|
||||||
.recv()
|
.recv()
|
||||||
.await;
|
.await;
|
||||||
};
|
};
|
||||||
#[cfg(not(unix))]
|
#[cfg(not(unix))]
|
||||||
let terminate = std::future::pending::<()>();
|
let terminate = std::future::pending::<()>();
|
||||||
tokio::select! {
|
tokio::select! {
|
||||||
_ = ctrl_c => {},
|
_ = ctrl_c => {},
|
||||||
_ = terminate => {},
|
_ = terminate => {},
|
||||||
|
|
Loading…
Reference in New Issue