Skip to content

Commit

Permalink
add option to redirect stdout/stderr to an mpsc::channel
Browse files Browse the repository at this point in the history
  • Loading branch information
pythcoiner committed Sep 25, 2024
1 parent c565e87 commit d0e740d
Showing 1 changed file with 33 additions and 20 deletions.
53 changes: 33 additions & 20 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,9 @@ pub struct Conf<'a> {
/// if `true` electrsd log output will not be suppressed
pub view_stderr: bool,

/// Log level of electrs
pub log_level: log::Level,
/// if true, logs (stdout + stderr) are redirected to ElectrsD.logs
/// note: this feature will take precedence over `view_stderr`
pub buffered_logs: bool,

/// if `true` electrsd exposes an esplora endpoint
pub http_enabled: bool,
Expand Down Expand Up @@ -108,7 +109,7 @@ impl Default for Conf<'_> {
tmpdir: None,
staticdir: None,
attempts: 3,
log_level: log::Level::Info,
buffered_logs: false,
}
}
}
Expand Down Expand Up @@ -258,35 +259,42 @@ impl ElectrsD {
None
};

let log_level = format!("--log-filters {}", conf.log_level);
args.push(&log_level);
let (stderr, stdout) = if conf.buffered_logs {
(Stdio::piped(), Stdio::piped())
} else if conf.view_stderr {
(Stdio::inherit(), Stdio::null())
} else {
(Stdio::null(), Stdio::null())
};

debug!("args: {:?}", args);
let mut process = Command::new(&exe)
.args(args)
.stderr(Stdio::piped())
.stdout(Stdio::piped())
.stderr(stderr)
.stdout(stdout)
.spawn()
.with_context(|| format!("Error while executing {:?}", exe.as_ref()))?;

let (sender, logs) = mpsc::channel();
let stdout = process.stdout.take().unwrap();
let stderr = process.stderr.take().unwrap();

let s = sender.clone();
thread::spawn(move || {
let reader = BufReader::new(stdout);
for line in reader.lines() {
s.send(line.unwrap());
}
});
if conf.buffered_logs {
let s = sender.clone();
thread::spawn(move || {
let reader = BufReader::new(stdout);
for line in reader.lines() {
s.send(line.unwrap());
}
});

thread::spawn(move || {
let reader = BufReader::new(stderr);
for line in reader.lines() {
sender.send(line.unwrap());
}
});
thread::spawn(move || {
let reader = BufReader::new(stderr);
for line in reader.lines() {
sender.send(line.unwrap());
}
});
}

let client = loop {
if let Some(status) = process.try_wait()? {
Expand Down Expand Up @@ -351,6 +359,11 @@ impl ElectrsD {
}
}

/// clear the log buffer
pub fn clear_logs(&mut self) {
while self.logs.try_recv().is_ok() {}
}

#[cfg(not(target_os = "windows"))]
fn inner_kill(&mut self) -> anyhow::Result<()> {
// Send SIGINT signal to electrsd
Expand Down

0 comments on commit d0e740d

Please sign in to comment.