diff --git a/Cargo.lock b/Cargo.lock index d2a0e851..ad6f9d53 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2631,6 +2631,15 @@ dependencies = [ "syn", ] +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + [[package]] name = "objc" version = "0.2.7" @@ -3020,7 +3029,7 @@ dependencies = [ "line-wrap", "quick-xml", "serde", - "time 0.3.17", + "time 0.3.20", ] [[package]] @@ -3901,7 +3910,7 @@ dependencies = [ "sqlx-rt", "stringprep", "thiserror", - "time 0.3.17", + "time 0.3.20", "tokio-stream", "url", "webpki-roots", @@ -4239,7 +4248,7 @@ dependencies = [ "sha2 0.10.6", "tauri-utils", "thiserror", - "time 0.3.17", + "time 0.3.20", "uuid 1.3.0", "walkdir", ] @@ -4337,7 +4346,7 @@ dependencies = [ "serde_json", "serde_repr", "tauri", - "time 0.3.17", + "time 0.3.20", ] [[package]] @@ -4388,7 +4397,7 @@ dependencies = [ "sqlx", "tauri", "thiserror", - "time 0.3.17", + "time 0.3.20", "tokio", ] @@ -4614,11 +4623,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.17" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" dependencies = [ "itoa 1.0.5", + "libc", + "num_threads", "serde", "time-core", "time-macros", @@ -4632,9 +4643,9 @@ checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" [[package]] name = "time-macros" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" dependencies = [ "time-core", ] diff --git a/plugins/log/Cargo.toml b/plugins/log/Cargo.toml index 41a1457a..94ad25f0 100644 --- a/plugins/log/Cargo.toml +++ b/plugins/log/Cargo.toml @@ -17,7 +17,7 @@ serde_repr = "0.1" byte-unit = "4.0" fern = "0.6" log = { workspace = true, features = ["kv_unstable"] } -time = { version = "0.3", features = ["formatting"] } +time = { version = "0.3", features = ["formatting", "local-offset"] } [features] colored = ["fern/colored"] \ No newline at end of file diff --git a/plugins/log/src/lib.rs b/plugins/log/src/lib.rs index 2ab8ced9..5f40cab0 100644 --- a/plugins/log/src/lib.rs +++ b/plugins/log/src/lib.rs @@ -21,9 +21,11 @@ use tauri::{ }; pub use fern; +use time::OffsetDateTime; const DEFAULT_MAX_FILE_SIZE: u128 = 40000; const DEFAULT_ROTATION_STRATEGY: RotationStrategy = RotationStrategy::KeepOne; +const DEFAULT_TIMEZONE_STRATEGY: TimezoneStrategy = TimezoneStrategy::UseUtc; const DEFAULT_LOG_TARGETS: [LogTarget; 2] = [LogTarget::Stdout, LogTarget::LogDir]; /// An enum representing the available verbosity levels of the logger. @@ -83,6 +85,23 @@ pub enum RotationStrategy { KeepOne, } +#[derive(Debug, Clone)] +pub enum TimezoneStrategy { + UseUtc, + UseLocal, +} + +impl TimezoneStrategy { + pub fn get_now(&self) -> OffsetDateTime { + match self { + TimezoneStrategy::UseUtc => OffsetDateTime::now_utc(), + TimezoneStrategy::UseLocal => { + OffsetDateTime::now_local().unwrap_or_else(|_| OffsetDateTime::now_utc()) + } // Fallback to UTC since Rust cannot determine local timezone + } + } +} + #[derive(Debug, Serialize, Clone)] struct RecordPayload { message: String, @@ -145,6 +164,7 @@ fn log( pub struct Builder { dispatch: fern::Dispatch, rotation_strategy: RotationStrategy, + timezone_strategy: TimezoneStrategy, max_file_size: u128, targets: Vec, } @@ -157,7 +177,7 @@ impl Default for Builder { let dispatch = fern::Dispatch::new().format(move |out, message, record| { out.finish(format_args!( "{}[{}][{}] {}", - time::OffsetDateTime::now_utc().format(&format).unwrap(), + DEFAULT_TIMEZONE_STRATEGY.get_now().format(&format).unwrap(), record.target(), record.level(), message @@ -166,6 +186,7 @@ impl Default for Builder { Self { dispatch, rotation_strategy: DEFAULT_ROTATION_STRATEGY, + timezone_strategy: DEFAULT_TIMEZONE_STRATEGY, max_file_size: DEFAULT_MAX_FILE_SIZE, targets: DEFAULT_LOG_TARGETS.into(), } @@ -182,6 +203,24 @@ impl Builder { self } + pub fn timezone_strategy(mut self, timezone_strategy: TimezoneStrategy) -> Self { + self.timezone_strategy = timezone_strategy.clone(); + + let format = + time::format_description::parse("[[[year]-[month]-[day]][[[hour]:[minute]:[second]]") + .unwrap(); + self.dispatch = fern::Dispatch::new().format(move |out, message, record| { + out.finish(format_args!( + "{}[{}][{}] {}", + timezone_strategy.get_now().format(&format).unwrap(), + record.target(), + record.level(), + message + )) + }); + self + } + pub fn max_file_size(mut self, max_file_size: u128) -> Self { self.max_file_size = max_file_size; self @@ -228,10 +267,12 @@ impl Builder { let format = time::format_description::parse("[[[year]-[month]-[day]][[[hour]:[minute]:[second]]") .unwrap(); + + let timezone_strategy = self.timezone_strategy.clone(); self.format(move |out, message, record| { out.finish(format_args!( "{}[{}][{}] {}", - time::OffsetDateTime::now_utc().format(&format).unwrap(), + timezone_strategy.get_now().format(&format).unwrap(), record.target(), colors.color(record.level()), message @@ -259,6 +300,7 @@ impl Builder { &path, app_name, &self.rotation_strategy, + &self.timezone_strategy, self.max_file_size, )?)? .into() @@ -273,6 +315,7 @@ impl Builder { &path, app_name, &self.rotation_strategy, + &self.timezone_strategy, self.max_file_size, )?)? .into() @@ -306,6 +349,7 @@ fn get_log_file_path( dir: &impl AsRef, app_name: &str, rotation_strategy: &RotationStrategy, + timezone_strategy: &TimezoneStrategy, max_file_size: u128, ) -> plugin::Result { let path = dir.as_ref().join(format!("{app_name}.log")); @@ -318,7 +362,8 @@ fn get_log_file_path( let to = dir.as_ref().join(format!( "{}_{}.log", app_name, - time::OffsetDateTime::now_utc() + timezone_strategy + .get_now() .format( &time::format_description::parse( "[year]-[month]-[day]_[hour]-[minute]-[second]"