4 个稳定版本
3.0.1 | 2020 年 9 月 27 日 |
---|---|
3.0.0 | 2020 年 9 月 18 日 |
2.0.0 | 2019 年 12 月 29 日 |
1.0.0 | 2019 年 12 月 29 日 |
#1217 在 HTTP 服务器
每月 29 次下载
10KB
66 行
actix-web-middleware-requestid
适用于 actix-web 框架 v3.0+ 的请求 ID 中间件
为每个请求添加一个带有唯一令牌的自定义头部。还包括一个符合 actix-web 的请求提取器。
使用方法
将包添加到 Cargo.toml
[dependencies]
actix-web-middleware-requestid = "3.0"
导入并添加中间件到您的服务器定义
use actix_web_middleware_requestid::RequestIDWrapper;
...
fn main() -> std::io::Result<()> {
App::new()
...
.wrap(RequestIDWrapper)
...
}
...
async fn index(id: RequestID) -> HttpResponse {
log::info!("id: {}", id.0);
...
}
对于 actix-web v1.x,请使用同一包的 "1.0" 版本。使用模式和所有导出的名称保持不变。
最小示例
use actix_web::{middleware, web, App, HttpResponse, HttpServer};
use actix_web_middleware_requestid::{RequestID, RequestIDWrapper};
// actix web application state
pub struct AppState {
pub logger: slog::Logger,
}
fn index((state, id): (web::Data<AppState>, RequestID)) -> HttpResponse {
let logger = state.logger.new(slog::o!("request_id" => id.0));
slog::info!(logger, "i am request");
HttpResponse::Ok()
.content_type("application/json")
.body("{}")
}
const LOG_TPLT: &str = "[Code: %s] [Payload: %b] [TTS: %T], request_id: %{x-request-id}i";
fn init_logger() -> slog::Logger {
use slog::Drain;
let decorator = slog_term::TermDecorator::new().build();
let drain = slog_term::FullFormat::new(decorator).build().fuse();
let drain = slog_async::Async::new(drain).chan_size(512).build().fuse();
slog::Logger::root(drain, slog::o!())
}
fn main() -> std::io::Result<()> {
// define env vars if missed
dotenv::dotenv().ok();
// initialise the logger
let root_log = init_logger();
// define scope logger (for middleware logging)
let _scope_guard = slog_scope::set_global_logger(root_log.new(slog::o!()));
slog_stdlog::init().unwrap();
// slog wrapper to catch log-based logs
slog_scope::scope(&root_log.new(slog::o!()), || {
HttpServer::new(move || {
App::new()
.data(AppState {
logger: root_log.new(slog::o!()),
})
.wrap(middleware::Logger::new(LOG_TPLT))
.wrap(RequestIDWrapper)
.service(web::resource("/").to(index))
})
.bind("0.0.0.0:8080")?
.run()
})
}
对于 actix-web < 1.0
请考虑使用类似的 crate actix-web-requestid
许可证
本项目许可协议为以下之一
- Apache License, Version 2.0, (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
依赖
~27MB
~582K SLoC