日志构建逻辑调整

This commit is contained in:
胡天 2024-02-02 17:58:05 +08:00
parent 2d8b593c4d
commit 5521b202a6
4 changed files with 38 additions and 15 deletions

2
.env
View File

@ -1,5 +1,5 @@
# 日志级别
RUST_LOG=DEBUG
RUST_LOG=INFO
# 运行模式
RUN_MODE=dev

18
Cargo.lock generated
View File

@ -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"

View File

@ -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"] }

View File

@ -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 => {},