From 8bb34fd93eb78d734906fb44c2231fca118cc432 Mon Sep 17 00:00:00 2001 From: Kyle Kelley Date: Mon, 29 Jul 2024 14:23:35 -0700 Subject: [PATCH] repl: Log Jupyter kernel process stderr and stdout (#15391) Super simple piping of logs from the Jupyter kernels to the Zed logs. Release Notes: - Added logging of stderr from Jupyter kernels to the Zed logs --- crates/repl/src/kernels.rs | 4 ++-- crates/repl/src/session.rs | 31 ++++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/crates/repl/src/kernels.rs b/crates/repl/src/kernels.rs index e8b483545d3a14d691acf7f88b4a9e459880fa8a..359d16fcab1b13a652e9064661ec1eebfcfc9702 100644 --- a/crates/repl/src/kernels.rs +++ b/crates/repl/src/kernels.rs @@ -223,8 +223,8 @@ impl RunningKernel { let process = cmd .current_dir(&working_directory) - // .stdout(Stdio::null()) - // .stderr(Stdio::null()) + .stdout(std::process::Stdio::piped()) + .stderr(std::process::Stdio::piped()) .kill_on_drop(true) .spawn() .context("failed to start the kernel process")?; diff --git a/crates/repl/src/session.rs b/crates/repl/src/session.rs index ca1c03e28ad5bc83ec5e070cd69dd2751650d031..4803b093d96803f50325a4f179a34c89d790a0d0 100644 --- a/crates/repl/src/session.rs +++ b/crates/repl/src/session.rs @@ -14,7 +14,8 @@ use editor::{ scroll::Autoscroll, Anchor, AnchorRangeExt as _, Editor, MultiBuffer, ToPoint, }; -use futures::{FutureExt as _, StreamExt as _}; +use futures::io::BufReader; +use futures::{AsyncBufReadExt as _, FutureExt as _, StreamExt as _}; use gpui::{ div, prelude::*, EntityId, EventEmitter, Model, Render, Subscription, Task, View, ViewContext, WeakView, @@ -242,6 +243,34 @@ impl Session { this.update(&mut cx, |session, cx| { // At this point we can create a new kind of kernel that has the process and our long running background tasks + let stderr = kernel.process.stderr.take(); + + cx.spawn(|_session, mut _cx| async move { + if let None = stderr { + return; + } + let reader = BufReader::new(stderr.unwrap()); + let mut lines = reader.lines(); + while let Some(Ok(line)) = lines.next().await { + log::error!("kernel: {}", line); + } + }) + .detach(); + + let stdout = kernel.process.stderr.take(); + + cx.spawn(|_session, mut _cx| async move { + if let None = stdout { + return; + } + let reader = BufReader::new(stdout.unwrap()); + let mut lines = reader.lines(); + while let Some(Ok(line)) = lines.next().await { + log::info!("kernel: {}", line); + } + }) + .detach(); + let status = kernel.process.status(); session.kernel(Kernel::RunningKernel(kernel), cx);