如何使用 Axum 正确过滤请求日志?

Ale*_*jak 11 rust rust-tracing rust-axum

我将 Axum 用于相对简单的 Web API,并希望获得类似于 Go Gin、IIS 日志、Python FastAPI 等的传入请求的日志记录/跟踪输出 - 简单的路径和参数输出。

HTTP 层已添加到路由器:

let app = Router::new()
    .route("/hello", get(hello_img))
    .layer(TraceLayer::new_for_http());
Run Code Online (Sandbox Code Playgroud)

这大约导致我正在寻找的内容: 良好的输出

然而,还有很多额外的不需要的日志记录正在发生,所以我添加了一个过滤器来排除这些日志记录。添加过滤器后:

let filter = filter::Targets::new()
    .with_target("tower_http::trace::on_response", Level::TRACE)
    .with_target("tower_http::trace::on_request", Level::TRACE)
    .with_default(Level::INFO);
Run Code Online (Sandbox Code Playgroud)

并将其添加到订阅者:

let tracing_layer = tracing_subscriber::fmt::layer();

tracing_subscriber::registry()
    .with(tracing_layer)
    .with(filter)
    .init();
Run Code Online (Sandbox Code Playgroud)

输出更改为 坏输出

详细信息(方法、URI、参数)都消失了。

即使没有指定格式更改,为什么会发生这种情况?如何在控制台中保留请求/响应跟踪,但过滤掉其他不需要的跟踪?

Han*_*ola 5

您的过滤器当前过滤 make_span。将其添加到您的目标中:

.with_target("tower_http::trace::make_span", Level::DEBUG)
Run Code Online (Sandbox Code Playgroud)

编辑: Level::DEBUG应该足以满足您的目标

  • 您添加的过滤器不允许从此文件发出调试级别跟踪,您想要的跟踪来自 https://docs.rs/tower-http/latest/src/tower_http/trace/make_span。 rs.html#13 (2认同)