pipe-logger 2.0.0

Stores, rotates, compresses process logs.
Documentation
mod cli;

use std::io;

use anyhow::Context;
use byte_unit::Byte;
use cli::*;
use pipe_logger_lib::{CompressionMethod, PipeLoggerBuilder, RotateMethod, Tee};

fn main() -> anyhow::Result<()> {
    let args = get_args();

    let mut builder = PipeLoggerBuilder::new(args.log_path);

    if let Some(r) = args.rotate {
        let byte = Byte::parse_str(&r, true)
            .with_context(|| format!("failed to parse the rotation size {r:?}"))?;

        builder.set_rotate(Some(RotateMethod::FileSize(byte.as_u64())));
        builder.set_compression(args.compress.then_some(CompressionMethod::Xz(9)));
        builder.set_count(args.count);
    }

    if args.quiet {
        builder.set_tee(None);
    } else if args.err {
        builder.set_tee(Some(Tee::Stderr));
    } else {
        builder.set_tee(Some(Tee::Stdout));
    }

    let mut logger = builder.build().context("failed to build the logger")?;
    let mut stdin = io::stdin().lock();

    io::copy(&mut stdin, &mut logger).context("failed to copy stdin to log outputs")?;

    logger.finish().context("failed to finish logger")?;

    Ok(())
}