在開發程式的時候,經常會需要使用「Log」或是「Console」等類別輸出某些文字訊息來告訴系統管理員程式執行的狀況。當程式作為背景服務來運行的時候,通常會將這些Log訊息寫進檔案系統內,方便日後查閱。然而,儲存在檔案系統中的每則文字訊息雖然可能只是短短的幾行字,但累積久了也是會佔用不少硬碟空間,如果沒有定期整理的話,可能哪天系統的可用空間就被歷史紀錄塞滿,而導致當機。為了避免程式輸出的訊息塞滿硬碟空間,除了可以使用先前介紹過的Pipe Logger外,還可以直接引入Pipe Logger的函式庫,直接在同一支程式內處理Log訊息。



Pipe Logger Lib

「Pipe Logger Lib」是筆者開發的套件,即Pipe Logger所使用的函式庫,可以限制Log訊息的儲存量,也可以自動對儲存下來的Log檔進行輪替(rotate)和壓縮封存的動作。

Crates.io

https://crates.io/crates/pipe-logger-lib

Cargo.toml

pipe-logger-lib = "*"

使用方法

「pipe-logger-lib」這個crate下提供了「PipeLoggerBuilder」結構體,可以用來建立特定功能的「PipeLogger」結構實體。

舉例來說,以下程式可以建立出一個「PipeLogger」結構實體,它能將Log訊息輸出到標準輸出(stdout)和「mylog.txt」檔案內,當檔案大小超過30個位元組的時候就會進行「輪替」,被輪替的Log檔會使用XZ來壓縮封存,且這些Log檔案的數量不超過10個。

extern crate pipe_logger_lib;

use pipe_logger_lib::*;

let log_file = Path::new("mylog.txt");

let mut builder = PipeLoggerBuilder::new(log_file);

builder
    .set_tee(Some(Tee::Stdout))
    .set_rotate(Some(RotateMethod::FileSize(30))) // bytes
    .set_count(Some(10))
    .set_compress(true);

let pipe_logger = builder.build().unwrap();

「PipeLogger」結構實體提供了「write」和「write_line」方法,可以對Log檔進行寫入的動作,同時也可以將Log訊息輸出至標準輸出或是標準錯誤(stderr)中。

logger.write_line("Hello world!").unwrap();

logger.write_line("Other logs...").unwrap();

logger.write("End").unwrap();