From 01d800239318ac7790ecab4b3371bbc97580bcdc Mon Sep 17 00:00:00 2001 From: soruh Date: Sat, 18 Mar 2023 21:03:41 +0100 Subject: [PATCH] implement duration logging --- Cargo.lock | 1 + Cargo.toml | 1 + src/main.rs | 17 ++++++++++++++--- src/ports.rs | 21 +++++---------------- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8f5ee38..0e2a797 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -184,6 +184,7 @@ dependencies = [ "console-subscriber", "futures", "hyper", + "once_cell", "serde", "serde_json", "time", diff --git a/Cargo.toml b/Cargo.toml index c6d67f7..f6b7884 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,7 @@ console-subscriber = { version = "0.1.8", optional = true } tracing = "0.1.37" tracing-subscriber = { version = "0.3.16", features = ["time"] } time = { version = "0.3.20", features = ["local-offset", "macros"] } +once_cell = "1.17.1" [features] default = ["debug_server"] diff --git a/src/main.rs b/src/main.rs index 3b38f3a..dfa6baa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -138,6 +138,11 @@ fn spawn( .unwrap_or_else(|err| panic!("failed to spawn {name:?}: {err:?}")) } +static TIME_ZONE_OFFSET: once_cell::sync::OnceCell = + once_cell::sync::OnceCell::new(); + +static TIME_FORMAT: once_cell::sync::OnceCell = once_cell::sync::OnceCell::new(); + fn main() -> anyhow::Result<()> { let config = Arc::new(Config::load("config.json")?); @@ -145,7 +150,13 @@ fn main() -> anyhow::Result<()> { panic!("no allowed ports"); } - let local_offset = time::UtcOffset::local_offset_at(time::OffsetDateTime::UNIX_EPOCH)?; + TIME_FORMAT.set(config.time_format.clone()).unwrap(); + + TIME_ZONE_OFFSET + .set(time::UtcOffset::local_offset_at( + time::OffsetDateTime::UNIX_EPOCH, + )?) + .unwrap(); tokio::runtime::Builder::new_multi_thread() .enable_all() @@ -167,8 +178,8 @@ fn main() -> anyhow::Result<()> { fmt::layer() .with_target(false) .with_timer(fmt::time::OffsetTime::new( - local_offset, - config.time_format.clone(), + *TIME_ZONE_OFFSET.get().unwrap(), + TIME_FORMAT.get().unwrap(), )) .with_filter(filter::LevelFilter::from_level(config.log_level)), ) diff --git a/src/ports.rs b/src/ports.rs index 76cb792..b891452 100644 --- a/src/ports.rs +++ b/src/ports.rs @@ -17,7 +17,7 @@ use tracing::{error, info, warn}; use crate::{ packets::Packet, spawn, Config, Number, Port, UnixTimestamp, PORT_OWNERSHIP_TIMEOUT, - PORT_RETRY_TIME, + PORT_RETRY_TIME, TIME_FORMAT, TIME_ZONE_OFFSET, }; #[derive(Default, Serialize, Deserialize)] @@ -66,22 +66,11 @@ fn duration_in_hours(duration: Duration) -> String { fn format_instant(instant: Instant) -> String { let when = duration_in_hours(instant.elapsed()) + " ago"; - todo!(); - - #[cfg(feature = "chrono")] let when = (|| -> anyhow::Result<_> { - use chrono::{Local, TimeZone}; - - let date = Local - .timestamp_opt( - (SystemTime::now().duration_since(UNIX_EPOCH)? - instant.elapsed()) - .as_secs() - .try_into()?, - 0, - ) - .latest() - .ok_or(anyhow!("invalid update timestamp"))? - .format("%Y-%m-%d %H:%M:%S"); + let timestamp = SystemTime::now().duration_since(UNIX_EPOCH)? - instant.elapsed(); + let date = time::OffsetDateTime::from_unix_timestamp(timestamp.as_secs() as i64)? + .to_offset(*TIME_ZONE_OFFSET.get().unwrap()) + .format(TIME_FORMAT.get().unwrap())?; Ok(format!("{date} ({when})")) })()