diff --git a/Cargo.lock b/Cargo.lock index 63160b5..fc00522 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -169,18 +169,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] name = "async-trait" -version = "0.1.78" +version = "0.1.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "461abc97219de0eaaf81fe3ef974a540158f3d079c2ab200f891f1a2ef201e85" +checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -411,7 +411,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -683,9 +683,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" [[package]] name = "flate2" @@ -784,7 +784,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -1367,7 +1367,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -1901,9 +1901,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -2276,7 +2276,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -2376,7 +2376,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -2459,9 +2459,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.53" +version = "2.0.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" +checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" dependencies = [ "proc-macro2", "quote", @@ -2533,7 +2533,7 @@ checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -2638,7 +2638,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] @@ -2950,7 +2950,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", "wasm-bindgen-shared", ] @@ -2984,7 +2984,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3234,7 +3234,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.55", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 395d7c7..57c4a15 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ readme = "./README.md" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -async-trait = "0.1.78" +async-trait = "0.1.79" base64 = "0.22.0" bytes = "1.6.0" bytesize = "1.3.0" diff --git a/conf/pingap.toml b/conf/pingap.toml index f4f68b7..8503af1 100644 --- a/conf/pingap.toml +++ b/conf/pingap.toml @@ -86,7 +86,8 @@ addr = "0.0.0.0:6188" # tls_key = "" # Access log format layout for the server. Default `None` -access_log = '"{method} {uri} {proto}" {status} {size-human} "{referer}" "{user-agent}" {latency-human}' +# access_log = '"{method} {uri} {proto}" {status} {size-human} "{referer}" "{user-agent}" {latency-human}' +access_log = "tiny" # Location list for the server, item should be the name of location. # The locations should be served by the server. diff --git a/docs/log_zh.md b/docs/log_zh.md index 2b66e42..3428d4b 100644 --- a/docs/log_zh.md +++ b/docs/log_zh.md @@ -2,4 +2,31 @@ description: Pingap 请求日志格式化 --- -Pingap格式化相关参数,具体参数说明如下: +Pingap格式化可以使用以下几种默认形式`combined`,`common`,`short`以及`tiny`。也可自定义完整的日志格式化输出,具体参数说明如下: + +- `{host}`: 请求的host属性 +- `{method}`: 请求的method +- `{path}`: 请求的路径 +- `{proto}`: 协议类型,`HTTP/1.1`或`HTTP/2.0` +- `{query}`: 请求的querystring +- `{remote}`: 请求的源ip +- `{client-ip}`: 客户ip,根据`x-forwarded-for`中获取 +- `{scheme}`: +- `{uri}`: 请求的完整地址 +- `{referer}`: 请求头中的referer +- `{user-agent}`: 请求的user-agent +- `{when}`: 日志的输出时间 +- `{when-utc-iso}`: 日志的输出的utc时间 +- `{when-unix}`: 日志的输出时间,格式为时间戳 +- `{size}`: 响应数据的字节数 +- `{size-human}`: 响应数据的大小,按数据大小格式化字符串 +- `{status}`: 响应状态码 +- `{latency}`: 响应时间的ms +- `{latency-human}`: 响应时间,按时间格式化 +- `{payload-size}`: 请求数据的字节大小 +- `{payload-size-human}`: 请求数据的大小,按数据大小格式化字符串 +- `{~cookiename}`: 从cookie中获取对应的值 +- `{>requestHeaderName}`: 请求头中获取对应的值 +- `{ = std::result::Result; pub type HttpHeader = (HeaderName, HeaderValue); +/// Converts string slice to http headers pub fn convert_headers(header_values: &[String]) -> Result> { let mut arr = vec![]; for item in header_values { diff --git a/src/cache/http_response.rs b/src/cache/http_response.rs index a4621a3..7c4749f 100644 --- a/src/cache/http_response.rs +++ b/src/cache/http_response.rs @@ -7,15 +7,22 @@ use std::time::{SystemTime, UNIX_EPOCH}; #[derive(Default, Debug, Clone)] pub struct HttpResponse { + // http response status pub status: StatusCode, + // http response body pub body: Bytes, + // max age of http response pub max_age: Option, + // created time of http response pub created_at: Option, + // private for cache control pub private: Option, + // headers for http response pub headers: Option>, } impl HttpResponse { + /// Gets the response header from http response pub fn get_response_header(&self) -> pingora::Result { let fix_size = 3; let size = self @@ -60,6 +67,7 @@ impl HttpResponse { } Ok(resp) } + /// Sends http response to client pub async fn send(self, session: &mut Session) -> pingora::Result { let header = self.get_response_header()?; let size = self.body.len(); diff --git a/src/proxy/logger.rs b/src/proxy/logger.rs index 49bba06..ed2739c 100644 --- a/src/proxy/logger.rs +++ b/src/proxy/logger.rs @@ -81,8 +81,21 @@ fn format_extra_tag(key: &str) -> Option { } } +static COMBINED: &str = + r###"{remote} "{method} {uri} {proto}" {status} {size-human} "{referer}" "{userAgent}""###; +static COMMON: &str = r###"{remote} "{method} {uri} {proto}" {status} {size-human}""###; +static SHORT: &str = r###"{remote} {method} {uri} {proto} {status} {size-human} - {latency}ms"###; +static TINY: &str = r###"{method} {uri} {status} {size-human} - {latency}ms"###; + impl From<&str> for Parser { fn from(value: &str) -> Self { + let value = match value { + "combined" => COMBINED, + "common" => COMMON, + "short" => SHORT, + "tiny" => TINY, + _ => value, + }; let reg = Regex::new(r"(\{[a-zA-Z_<>\-~:$]+*\})").unwrap(); let mut current = 0; let mut end = 0; diff --git a/src/proxy/server.rs b/src/proxy/server.rs index e2a420a..15df2a9 100644 --- a/src/proxy/server.rs +++ b/src/proxy/server.rs @@ -320,7 +320,6 @@ impl ProxyHttp for Server { return Ok(true); } } - Ok(false) } async fn upstream_peer(