reorganize optional access log member

This commit is contained in:
yggverse 2025-06-29 15:06:30 +03:00
parent 23c9c1b96e
commit ddcb1b5744
3 changed files with 31 additions and 32 deletions

View file

@ -56,14 +56,14 @@ impl Connection {
true true
}) })
}) { }) {
self.session if let Some(ref a) = self.session.access_log {
.access_log a.clf(&self.address.client, Some(&q), 0, t)
.clf(&self.address.client, Some(&q), 0, t); }
self.shutdown() self.shutdown()
} else { } else {
self.session if let Some(ref a) = self.session.access_log {
.access_log a.clf(&self.address.client, Some(&q), 1, t)
.clf(&self.address.client, Some(&q), 1, t); }
if self.session.is_debug { if self.session.is_debug {
println!( println!(
"[{}] - [{}] connection closed by client.", "[{}] - [{}] connection closed by client.",
@ -87,9 +87,9 @@ impl Connection {
self.address.server, self.address.client self.address.server, self.address.client
) )
}; };
self.session if let Some(ref a) = self.session.access_log {
.access_log a.clf(&self.address.client, None, 2, t)
.clf(&self.address.client, None, 2, t); }
self.shutdown() self.shutdown()
} }
Err(e) => { Err(e) => {
@ -97,9 +97,9 @@ impl Connection {
"[{}] > [{}] handle request error: `{e}`", "[{}] > [{}] handle request error: `{e}`",
self.address.server, self.address.client self.address.server, self.address.client
); );
self.session if let Some(ref a) = self.session.access_log {
.access_log a.clf(&self.address.client, None, 1, t)
.clf(&self.address.client, None, 1, t); }
self.shutdown() self.shutdown()
} }
}, },

View file

@ -7,7 +7,7 @@ use {access_log::AccessLog, public::Public, request::Request, template::Template
/// Shared, multi-thread features for the current server session /// Shared, multi-thread features for the current server session
pub struct Session { pub struct Session {
pub access_log: AccessLog, pub access_log: Option<AccessLog>,
pub public: Public, pub public: Public,
pub request: Option<Request>, pub request: Option<Request>,
pub template: Template, pub template: Template,

View file

@ -5,33 +5,32 @@
use std::{fs::File, io::Write, net::SocketAddr, sync::RwLock}; use std::{fs::File, io::Write, net::SocketAddr, sync::RwLock};
/// Writes log as /// Writes log as
pub struct AccessLog(Option<RwLock<File>>); pub struct AccessLog(RwLock<File>);
impl AccessLog { impl AccessLog {
pub fn init(config: &crate::config::Config) -> anyhow::Result<Self> { pub fn init(config: &crate::config::Config) -> anyhow::Result<Option<Self>> {
Ok(Self(match config.access_log { Ok(match config.access_log {
Some(ref p) => Some(RwLock::new(File::create(p)?)), Some(ref p) => Some(Self(RwLock::new(File::create(p)?))),
None => None, None => None,
})) })
} }
/// [CLF](https://en.wikipedia.org/wiki/Common_Log_Format) /// [CLF](https://en.wikipedia.org/wiki/Common_Log_Format)
/// ///
/// * the code value (`u8`) is relative, use 1|0 for failure / success /// * the code value (`u8`) is relative, use 1|0 for failure / success
pub fn clf(&self, client: &SocketAddr, query: Option<&str>, code: u8, size: usize) { pub fn clf(&self, client: &SocketAddr, query: Option<&str>, code: u8, size: usize) {
if let Some(ref f) = self.0 { self.0
f.write() .write()
.unwrap() .unwrap()
.write_all( .write_all(
format!( format!(
"{} {} - [{}] \"GET {}\" {code} {size}\n", "{} {} - [{}] \"GET {}\" {code} {size}\n",
client.ip(), client.ip(),
client.port(), client.port(),
chrono::Local::now().format("%d/%b/%Y:%H:%M:%S %z"), chrono::Local::now().format("%d/%b/%Y:%H:%M:%S %z"),
query.unwrap_or_default(), query.unwrap_or_default(),
)
.as_bytes(),
) )
.unwrap() .as_bytes(),
} )
.unwrap()
} }
} }