Unnamed repository; edit this file 'description' to name the repository.
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
Wilfred Hughes 2024-10-23
parent f9935be · commit 2b676bf
-rw-r--r--crates/rust-analyzer/src/tracing/config.rs20
1 files changed, 14 insertions, 6 deletions
diff --git a/crates/rust-analyzer/src/tracing/config.rs b/crates/rust-analyzer/src/tracing/config.rs
index 5ab2dc2b67..02ae4186ab 100644
--- a/crates/rust-analyzer/src/tracing/config.rs
+++ b/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) => {