about summary refs log tree commit diff
diff options
context:
space:
mode:
authorWilfred Hughes <wilfred@meta.com>2024-10-23 09:57:57 -0700
committerWilfred Hughes <wilfred@meta.com>2024-10-23 09:57:57 -0700
commit33f27d135e2d537b72adf8e67958a69e4fb81236 (patch)
tree03c79677ab4455c794fb6089826b8117acd64b4b
parent1fbaccd893b8d0f393c14e94d8fbfe0c601c2e8f (diff)
fix: Handle missing time offsets gracefully
The tracing_subscribe docs state that missing offsets likely mean
that we're in a multithreaded context:
https://docs.rs/tracing-subscriber/latest/tracing_subscriber/fmt/time/struct.OffsetTime.html#method.local_rfc_3339

We're not in a multithreaded context at this point, but some platforms
(e.g. OpenBSD) still don't have time offsets available.

Since this is only a rust-analyzer debugging convenience, just use
system time logging in this situation.

Fixes #18384
-rw-r--r--src/tools/rust-analyzer/crates/rust-analyzer/src/tracing/config.rs20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/tools/rust-analyzer/crates/rust-analyzer/src/tracing/config.rs b/src/tools/rust-analyzer/crates/rust-analyzer/src/tracing/config.rs
index 5ab2dc2b67a..02ae4186ab6 100644
--- a/src/tools/rust-analyzer/crates/rust-analyzer/src/tracing/config.rs
+++ b/src/tools/rust-analyzer/crates/rust-analyzer/src/tracing/config.rs
@@ -58,14 +58,22 @@ where
         let writer = self.writer;
 
         let ra_fmt_layer = tracing_subscriber::fmt::layer()
-            .with_timer(
-                time::OffsetTime::local_rfc_3339()
-                    .expect("Could not get local offset, make sure you're on the main thread"),
-            )
             .with_target(false)
             .with_ansi(false)
-            .with_writer(writer)
-            .with_filter(targets_filter);
+            .with_writer(writer);
+
+        let ra_fmt_layer = match time::OffsetTime::local_rfc_3339() {
+            Ok(timer) => {
+                // If we can get the time offset, format logs with the timezone.
+                ra_fmt_layer.with_timer(timer).boxed()
+            }
+            Err(_) => {
+                // Use system time if we can't get the time offset. This should
+                // never happen on Linux, but can happen on e.g. OpenBSD.
+                ra_fmt_layer.boxed()
+            }
+        }
+        .with_filter(targets_filter);
 
         let chalk_layer = match self.chalk_filter {
             Some(chalk_filter) => {