gardesk/tarmac / 9605927

Browse files

Add rolling file logging

Authored by espadonne
SHA
9605927ed0af679d92ed36a3f3dda600cea3aaab
Parents
6151565
Tree
efad302

3 changed files

StatusFile+-
M Cargo.lock 87 0
M tarmac/Cargo.toml 1 0
M tarmac/src/main.rs 38 3
Cargo.lockmodified
@@ -70,6 +70,21 @@ version = "0.2.1"
7070
 source = "registry+https://github.com/rust-lang/crates.io-index"
7171
 checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
7272
 
73
+[[package]]
74
+name = "crossbeam-channel"
75
+version = "0.5.15"
76
+source = "registry+https://github.com/rust-lang/crates.io-index"
77
+checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
78
+dependencies = [
79
+ "crossbeam-utils",
80
+]
81
+
82
+[[package]]
83
+name = "crossbeam-utils"
84
+version = "0.8.21"
85
+source = "registry+https://github.com/rust-lang/crates.io-index"
86
+checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
87
+
7388
 [[package]]
7489
 name = "ctrlc"
7590
 version = "3.5.2"
@@ -81,6 +96,15 @@ dependencies = [
8196
  "windows-sys",
8297
 ]
8398
 
99
+[[package]]
100
+name = "deranged"
101
+version = "0.5.8"
102
+source = "registry+https://github.com/rust-lang/crates.io-index"
103
+checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
104
+dependencies = [
105
+ "powerfmt",
106
+]
107
+
84108
 [[package]]
85109
 name = "dirs"
86110
 version = "6.0.0"
@@ -295,6 +319,12 @@ dependencies = [
295319
  "windows-sys",
296320
 ]
297321
 
322
+[[package]]
323
+name = "num-conv"
324
+version = "0.2.1"
325
+source = "registry+https://github.com/rust-lang/crates.io-index"
326
+checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967"
327
+
298328
 [[package]]
299329
 name = "num-traits"
300330
 version = "0.2.19"
@@ -449,6 +479,12 @@ version = "0.3.32"
449479
 source = "registry+https://github.com/rust-lang/crates.io-index"
450480
 checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
451481
 
482
+[[package]]
483
+name = "powerfmt"
484
+version = "0.2.0"
485
+source = "registry+https://github.com/rust-lang/crates.io-index"
486
+checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
487
+
452488
 [[package]]
453489
 name = "proc-macro2"
454490
 version = "1.0.106"
@@ -611,6 +647,12 @@ version = "1.15.1"
611647
 source = "registry+https://github.com/rust-lang/crates.io-index"
612648
 checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
613649
 
650
+[[package]]
651
+name = "symlink"
652
+version = "0.1.0"
653
+source = "registry+https://github.com/rust-lang/crates.io-index"
654
+checksum = "a7973cce6668464ea31f176d85b13c7ab3bba2cb3b77a2ed26abd7801688010a"
655
+
614656
 [[package]]
615657
 name = "syn"
616658
 version = "2.0.117"
@@ -643,6 +685,7 @@ dependencies = [
643685
  "serde_json",
644686
  "thiserror",
645687
  "tracing",
688
+ "tracing-appender",
646689
  "tracing-subscriber",
647690
 ]
648691
 
@@ -684,6 +727,37 @@ dependencies = [
684727
  "cfg-if",
685728
 ]
686729
 
730
+[[package]]
731
+name = "time"
732
+version = "0.3.47"
733
+source = "registry+https://github.com/rust-lang/crates.io-index"
734
+checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c"
735
+dependencies = [
736
+ "deranged",
737
+ "itoa",
738
+ "num-conv",
739
+ "powerfmt",
740
+ "serde_core",
741
+ "time-core",
742
+ "time-macros",
743
+]
744
+
745
+[[package]]
746
+name = "time-core"
747
+version = "0.1.8"
748
+source = "registry+https://github.com/rust-lang/crates.io-index"
749
+checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"
750
+
751
+[[package]]
752
+name = "time-macros"
753
+version = "0.2.27"
754
+source = "registry+https://github.com/rust-lang/crates.io-index"
755
+checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215"
756
+dependencies = [
757
+ "num-conv",
758
+ "time-core",
759
+]
760
+
687761
 [[package]]
688762
 name = "tracing"
689763
 version = "0.1.44"
@@ -695,6 +769,19 @@ dependencies = [
695769
  "tracing-core",
696770
 ]
697771
 
772
+[[package]]
773
+name = "tracing-appender"
774
+version = "0.2.5"
775
+source = "registry+https://github.com/rust-lang/crates.io-index"
776
+checksum = "050686193eb999b4bb3bc2acfa891a13da00f79734704c4b8b4ef1a10b368a3c"
777
+dependencies = [
778
+ "crossbeam-channel",
779
+ "symlink",
780
+ "thiserror",
781
+ "time",
782
+ "tracing-subscriber",
783
+]
784
+
698785
 [[package]]
699786
 name = "tracing-attributes"
700787
 version = "0.1.31"
tarmac/Cargo.tomlmodified
@@ -89,6 +89,7 @@ block2 = "0.6"
8989
 
9090
 # Logging
9191
 tracing = "0.1"
92
+tracing-appender = "0.2"
9293
 tracing-subscriber = { version = "0.3", features = ["env-filter"] }
9394
 
9495
 # Lua configuration
tarmac/src/main.rsmodified
@@ -1,6 +1,7 @@
11
 use std::cell::RefCell;
22
 use std::ffi::c_void;
33
 use std::ptr;
4
+use std::sync::OnceLock;
45
 
56
 use tarmac::config::document::{KeybindRow, ManagedConfigDocument, RuleRow, WorkspaceRow};
67
 use tarmac::config::lua::{LuaKeybind, SpecialWorkspaceConfig, WindowRule};
@@ -12,6 +13,10 @@ use tarmac::platform::hotkey::HotkeyManager;
1213
 use tarmac::platform::permissions;
1314
 use tarmac::platform::workspace_observer::WorkspacePollingObserver;
1415
 use tracing_subscriber::EnvFilter;
16
+use tracing_subscriber::layer::SubscriberExt;
17
+use tracing_subscriber::util::SubscriberInitExt;
18
+
19
+static LOG_GUARD: OnceLock<tracing_appender::non_blocking::WorkerGuard> = OnceLock::new();
1520
 
1621
 thread_local! {
1722
     static WORKSPACE_POLLER: RefCell<Option<WorkspacePollingObserver>> = const { RefCell::new(None) };
@@ -777,13 +782,43 @@ unsafe extern "C" {
777782
 fn init_logging() {
778783
     let filter =
779784
         EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("tarmac=info"));
785
+    let stdout_layer = tracing_subscriber::fmt::layer().with_target(false);
786
+
787
+    if let Some(log_dir) = log_directory() {
788
+        if let Err(err) = std::fs::create_dir_all(&log_dir) {
789
+            eprintln!("tarmac: failed to create log directory {log_dir:?}: {err}");
790
+        } else {
791
+            let file_appender = tracing_appender::rolling::daily(&log_dir, "tarmac.log");
792
+            let (non_blocking, guard) = tracing_appender::non_blocking(file_appender);
793
+            let _ = LOG_GUARD.set(guard);
794
+            let file_layer = tracing_subscriber::fmt::layer()
795
+                .with_ansi(false)
796
+                .with_target(false)
797
+                .with_writer(non_blocking);
798
+
799
+            tracing_subscriber::registry()
800
+                .with(filter)
801
+                .with(stdout_layer)
802
+                .with(file_layer)
803
+                .init();
804
+            tracing::info!(path = %log_dir.join("tarmac.log").display(), "file logging enabled");
805
+            return;
806
+        }
807
+    }
780808
 
781
-    tracing_subscriber::fmt()
782
-        .with_env_filter(filter)
783
-        .with_target(false)
809
+    tracing_subscriber::registry()
810
+        .with(filter)
811
+        .with(stdout_layer)
784812
         .init();
785813
 }
786814
 
815
+fn log_directory() -> Option<std::path::PathBuf> {
816
+    dirs::state_dir()
817
+        .map(|dir| dir.join("tarmac").join("logs"))
818
+        .or_else(|| dirs::data_local_dir().map(|dir| dir.join("tarmac").join("logs")))
819
+        .or_else(|| dirs::home_dir().map(|dir| dir.join(".config").join("tarmac").join("logs")))
820
+}
821
+
787822
 fn init_config_dir() {
788823
     if let Some(home) = dirs::home_dir() {
789824
         let tarmac_config = home.join(".config").join("tarmac");