在開發程式的時候,經常會需要使用「Log」或是「Console」等類別輸出某些文字訊息來告訴系統管理員程式執行的狀況。當程式作為背景服務來運行的時候,通常會將這些Log訊息寫進檔案系統內,方便日後查閱。然而,儲存在檔案系統中的每則文字訊息雖然可能只是短短的幾行字,但累積久了也是會佔用不少硬碟空間,如果沒有定期整理的話,可能哪天系統的可用空間就被歷史紀錄塞滿,而導致當機。為了避免程式輸出的訊息塞滿硬碟空間,除了可以使用先前介紹過的Pipe Logger外,還可以直接引入Pipe Logger的函式庫,直接在同一支程式內處理Log訊息。
Pipe Logger Lib
「Pipe Logger Lib」是筆者開發的套件,即Pipe Logger所使用的函式庫,可以限制Log訊息的儲存量,也可以自動對儲存下來的Log檔進行輪替(rotate)和壓縮封存的動作。
Crates.io
Cargo.toml
pipe-logger-lib = "*"
使用方法
pipe_logger_lib
這個crate下提供了PipeLoggerBuilder
結構體,可以用來建立特定功能的PipeLogger
結構實體。
舉例來說,以下程式可以建立出一個PipeLogger
結構實體,它能將Log訊息輸出到標準輸出(stdout)和mylog.txt
檔案內,當檔案大小超過30個位元組的時候就會進行「輪替」,被輪替的Log檔會使用XZ來壓縮封存,且這些Log檔案的數量不超過10個。
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();