日志构建逻辑调整
This commit is contained in:
parent
2d8b593c4d
commit
5521b202a6
|
@ -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"
|
||||
|
|
|
@ -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"] }
|
||||
|
|
32
src/main.rs
32
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 => {},
|
||||
|
|
Loading…
Reference in New Issue