diff --git a/crates/ruff_server/src/server/connection.rs b/crates/ruff_server/src/server/connection.rs index c04567c57ae84..414c131c60ccd 100644 --- a/crates/ruff_server/src/server/connection.rs +++ b/crates/ruff_server/src/server/connection.rs @@ -88,21 +88,27 @@ impl Connection { lsp::Message::Request(lsp::Request { id, method, .. }) if method == lsp_types::request::Shutdown::METHOD => { - self.sender - .send(lsp::Response::new_ok(id.clone(), ()).into())?; - tracing::info!("Shutdown request received. Waiting for an exit notification..."); - match self.receiver.recv_timeout(std::time::Duration::from_secs(30))? { + tracing::subscriber::with_default(crate::trace::stderr_subscriber(), || { + self.sender + .send(lsp::Response::new_ok(id.clone(), ()).into())?; + tracing::info!( + "Shutdown request received. Waiting for an exit notification..." + ); + match self.receiver.recv_timeout(std::time::Duration::from_secs(30))? { lsp::Message::Notification(lsp::Notification { method, .. }) if method == lsp_types::notification::Exit::METHOD => { tracing::info!("Exit notification received. Server shutting down..."); Ok(true) }, message => anyhow::bail!("Server received unexpected message {message:?} while waiting for exit notification") } + }) } lsp::Message::Notification(lsp::Notification { method, .. }) if method == lsp_types::notification::Exit::METHOD => { - tracing::error!("Server received an exit notification before a shutdown request was sent. Exiting..."); + tracing::subscriber::with_default(crate::trace::stderr_subscriber(), || { + tracing::error!("Server received an exit notification before a shutdown request was sent. Exiting..."); + }); Ok(true) } _ => Ok(false), diff --git a/crates/ruff_server/src/trace.rs b/crates/ruff_server/src/trace.rs index c715e24a8080e..d31bb535d8041 100644 --- a/crates/ruff_server/src/trace.rs +++ b/crates/ruff_server/src/trace.rs @@ -10,6 +10,11 @@ static LOGGING_SENDER: OnceLock = OnceLock::new(); static TRACE_VALUE: Mutex = Mutex::new(lsp_types::TraceValue::Off); +pub(crate) fn stderr_subscriber() -> impl tracing::Subscriber { + tracing_subscriber::registry() + .with(tracing_subscriber::fmt::layer().with_writer(|| Box::new(std::io::stderr()))) +} + pub(crate) fn set_trace_value(trace_value: TraceValue) { let mut global_trace_value = TRACE_VALUE .lock()