diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-05-11 21:31:02 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-05-11 21:31:02 +0200 |
commit | 3bc00de077174a2242489aae6158971905a9ef38 (patch) | |
tree | 5324dc18dcd7601c0b0c6a8ac4c4f2457c2e1fd3 | |
parent | a1cafc2619368c97484a126476a9d747a395f6a2 (diff) |
log stdout and stderr asynchronously / independently
-rw-r--r-- | src/main.rs | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/src/main.rs b/src/main.rs index f08f75e..17a5db0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,7 @@ use anyhow::bail; use std::fs::{self, File}; use std::io::{BufRead, BufReader, Write}; use std::path::Path; -use std::process::{self, Child, Command, ExitCode, Stdio}; +use std::process::{self, ChildStderr, ChildStdout, Command, ExitCode, Stdio}; use std::thread; use std::time::Duration; use sys_mount::{Mount, Unmount, UnmountDrop, UnmountFlags}; @@ -37,8 +37,15 @@ fn start() -> anyhow::Result<()> { stdout.reset()?; writeln!(&mut stdout)?; + let service_name2 = service_name.clone(); thread::spawn(move || { - log(child, service_name).expect("logging failed"); + log_out(child.stdout.expect("no child stdout"), service_name2) + .expect("logging stdout failed"); + }); + + thread::spawn(move || { + log_err(child.stderr.expect("no child stderr"), service_name) + .expect("logging stderr failed"); }); } Err(e) => { @@ -54,11 +61,10 @@ fn start() -> anyhow::Result<()> { Ok(()) } -fn log(child: Child, service_name: String) -> anyhow::Result<()> { +fn log_out(pipe: ChildStdout, service_name: String) -> anyhow::Result<()> { let mut stdout = StandardStream::stdout(ColorChoice::Always); let mut file = File::create(Path::new("/data").join(service_name.clone() + ".log"))?; - let mut r = BufReader::new(child.stdout.expect("no child stdout")); - let mut r_err = BufReader::new(child.stderr.expect("no child stderr")); + let mut r = BufReader::new(pipe); loop { let mut buf = String::new(); @@ -72,17 +78,25 @@ fn log(child: Child, service_name: String) -> anyhow::Result<()> { file.write_all(buf.as_bytes())?; } + } +} - let mut buf_err = String::new(); - r_err.read_line(&mut buf_err)?; +fn log_err(pipe: ChildStderr, service_name: String) -> anyhow::Result<()> { + let mut stdout = StandardStream::stdout(ColorChoice::Always); + let mut file = File::create(Path::new("/data").join(service_name.clone() + ".log"))?; + let mut r = BufReader::new(pipe); - if !buf_err.is_empty() { - let buf_err = format!("[{}] {}", service_name, buf_err); + loop { + let mut buf = String::new(); + r.read_line(&mut buf)?; + + if !buf.is_empty() { + let buf = format!("[{}] {}", service_name, buf); stdout.set_color(ColorSpec::new().set_fg(Some(Color::White)))?; - write!(&mut stdout, "{}", buf_err)?; + write!(&mut stdout, "{}", buf)?; - file.write_all(buf_err.as_bytes())?; + file.write_all(buf.as_bytes())?; } } } |