use std::{env, fs::File, io, time::SystemTime};
struct LazyLogFile {
path: &'static str,
file: Option<File>,
}
impl LazyLogFile {
fn new(path: &'static str) -> Self {
Self { path, file: None }
}
}
impl io::Write for LazyLogFile {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
if self.file.is_none() {
self.file = Some(File::create(self.path)?);
}
self.file.as_mut().unwrap().write(buf)
}
fn flush(&mut self) -> io::Result<()> {
if let Some(ref mut file) = self.file {
file.flush()
} else {
Ok(())
}
}
}
pub fn init_logging() {
use env_logger::{Builder, Target};
use std::io::Write as _;
let mut builder = Builder::new();
builder.filter_level(log::LevelFilter::Info);
if let Ok(rust_log) = env::var("RUST_LOG") {
builder.parse_filters(&rust_log);
}
builder.format(|buf, record| {
let now = SystemTime::now()
.duration_since(SystemTime::UNIX_EPOCH)
.unwrap_or_default();
let secs = now.as_secs();
let millis = now.subsec_millis();
writeln!(
buf,
"[{}.{:03} {} {}] {}",
secs,
millis,
record.level(),
record.target(),
record.args()
)
});
builder.target(Target::Pipe(Box::new(LazyLogFile::new(
"t-rec-recording.log",
))));
builder.init();
}