From 7d6085ddbd32e6104c2f2940c851af83301d8bbd Mon Sep 17 00:00:00 2001 From: Haze Date: Wed, 3 Apr 2019 20:41:42 -0400 Subject: [PATCH] Add %U (URLPath) for logger (#752) * Add %R (Route) for logger * Requested Updates (Route => URLPath, %R => %U) --- CHANGES.md | 3 ++- src/middleware/logger.rs | 41 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 7a6e9b9bf..b7e0d7423 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,11 +6,12 @@ * `App::configure()` allow to offload app configuration to different methods +* Added `URLPath` option for logger + * Added `ServiceRequest::app_data()`, returns `Data` * Added `ServiceFromRequest::app_data()`, returns `Data` - ### Changed * Move multipart support to actix-multipart crate diff --git a/src/middleware/logger.rs b/src/middleware/logger.rs index bdcc00f28..3039b850f 100644 --- a/src/middleware/logger.rs +++ b/src/middleware/logger.rs @@ -65,6 +65,8 @@ use crate::HttpResponse; /// /// `%D` Time taken to serve the request, in milliseconds /// +/// `%U` Request URL +/// /// `%{FOO}i` request.headers['FOO'] /// /// `%{FOO}o` response.headers['FOO'] @@ -272,7 +274,7 @@ impl Format { /// Returns `None` if the format string syntax is incorrect. pub fn new(s: &str) -> Format { log::trace!("Access log format: {}", s); - let fmt = Regex::new(r"%(\{([A-Za-z0-9\-_]+)\}([ioe])|[atPrsbTD]?)").unwrap(); + let fmt = Regex::new(r"%(\{([A-Za-z0-9\-_]+)\}([ioe])|[atPrUsbTD]?)").unwrap(); let mut idx = 0; let mut results = Vec::new(); @@ -300,6 +302,7 @@ impl Format { "r" => FormatText::RequestLine, "s" => FormatText::ResponseStatus, "b" => FormatText::ResponseSize, + "U" => FormatText::UrlPath, "T" => FormatText::Time, "D" => FormatText::TimeMillis, _ => FormatText::Str(m.as_str().to_owned()), @@ -328,6 +331,7 @@ pub enum FormatText { Time, TimeMillis, RemoteAddr, + UrlPath, RequestHeader(String), ResponseHeader(String), EnvironHeader(String), @@ -413,6 +417,12 @@ impl FormatText { )) }; } + FormatText::UrlPath => { + *self = FormatText::Str(format!( + "{}", + req.path() + )) + } FormatText::RequestTime => { *self = FormatText::Str(format!( "{:?}", @@ -473,6 +483,35 @@ mod tests { let _res = block_on(srv.call(req)); } + #[test] + fn test_url_path() { + let mut format = Format::new("%T %U"); + let req = TestRequest::with_header( + header::USER_AGENT, + header::HeaderValue::from_static("ACTIX-WEB"), + ).uri("/test/route/yeah").to_srv_request(); + + let now = time::now(); + for unit in &mut format.0 { + unit.render_request(now, &req); + } + + let resp = HttpResponse::build(StatusCode::OK).force_close().finish(); + for unit in &mut format.0 { + unit.render_response(&resp); + } + + let render = |fmt: &mut Formatter| { + for unit in &format.0 { + unit.render(fmt, 1024, now)?; + } + Ok(()) + }; + let s = format!("{}", FormatDisplay(&render)); + println!("{}", s); + assert!(s.contains("/test/route/yeah")); + } + #[test] fn test_default_format() { let mut format = Format::default();