Use tower::ServiceBuilder to stack middleware layers and wrap your Axum router with tower::ServiceExt::into_make_service_with_connect_info or directly via axum::Router::layer.
use axum::{routing::get, Router};
use tower::{ServiceBuilder, ServiceExt};
use tower_http::trace::TraceLayer;
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/", get(|| async { "Hello" }))
.layer(TraceLayer::new_for_http())
.layer(ServiceBuilder::new().layer(tower_http::cors::CorsLayer::permissive()));
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}