在程式執行的時候,經常會需要輸出某些文字訊息來告訴系統管理員程式執行的狀況。這些訊息可能會直接輸出到螢幕上,或是寫進檔案中方便日後查閱或是處理。然而,儲存在檔案系統中的每則文字訊息雖然可能只是短短的幾行字,但累積久了也是會佔用不少硬碟空間,如果沒有定期整理的話,可能哪天系統的可用空間就被歷史紀錄塞滿,而導致當機。為了避免程式輸出的訊息塞滿硬碟空間,可以使用Pipe Logger來限制訊息被儲存下來的量,並且自動將舊的訊息進行壓縮封存的動作。



一般程式會將訊息輸出到標準輸出(stdout)中。舉例來說,在終端機使用「ping」指令時,會將每次ICMP封包的傳輸結果給輸出到標準輸出中,所以可以直接在螢幕上看到。

pipe-logger

如果我們想要將結果儲存下來,可以使用終端機的「管線」(pipeline)功能,將結果導出到檔案系統或是其它裝置。

pipe-logger

如上圖,將「ping」指令的輸出結果導出到「ping.log」檔案中。所以我們之後可以開啟「ping.log」檔案來查看結果。

pipe-logger

這樣的作法雖然可以成功將程式輸出的訊息儲存下來,卻沒有辦法限制訊息的儲存量。

Pipe Logger

「Pipe Logger」是筆者用Rust程式語言開發,用來導出Log檔的開源小工具。Pipe Logger可以限制Log訊息的儲存量,也可以自動對儲存下來的Log檔進行輪替(rotate)和壓縮封存的動作。

安裝Pipe Logger

如果系統環境中有安裝「Cargo」的話,可以直接使用以下指令來下載「Pipe Logger」的原始碼專案,並進行編譯安裝。

cargo install pipe-logger

如果是使用Linux作業系統的話,可以直接到以下頁面取得「Pipe Logger」的執行檔,手動放置到「/usr/local/bin」目錄中即可。網址如下:

https://github.com/magiclen/pipe-logger/releases

使用Pipe Logger

Pipe Logger的運作原理是將其標準輸入(stdin)中的內容儲存成檔案。也就是說,我們需要把要處理Log檔的程式的輸出當作是Pipe Logger的輸入,也是一樣使用終端機的「管線」功能就可以達成。

例如以下指令,可以將「ping magiclen.org」指令的輸出結果當作Pipe Logger的輸入,Pipe Logger則會再將結果導出到「ping.log」檔案中。與此同時,「ping」指令的輸出結果也會即時地輸出到螢幕上,有點像是「tee」指令的功能。

ping magiclen.org | pipe-logger ping.log

pipe-logger

如果要限制輸出的Log檔最大的大小,可以加上「-r」選項。當目前寫入的Log檔超過「-r」選項所指定的大小時,Pipe Logger就會更改目前謝入的Log檔檔名,然後再用舊的檔名產生新的Log檔案,以供後續的寫入。這樣的過程就稱為「Log輪替」(Log Rotation)。例如以下指令,可以將Log儲存成多個檔案,檔案會在超過「10MB」的時候進行「輪替」。

ping magiclen.org | pipe-logger ping.log -r 10M

如果要更進一步的限制Log檔加上輪替後Log檔的數量,可以加上「-c」選項。例如以下指令,可以限制Log檔的數量總共最多只能有4個。

ping magiclen.org | pipe-logger ping.log -r 10M -c 4

如果要將輪替後的Log檔進行XZ壓縮封存,可以再加上「--compress」選項。例如:

ping magiclen.org | pipe-logger ping.log -r 10M -c 4 --compress

當然,有些程式不是只會把訊息輸出到標準輸出中,它們也有去使用標準錯誤(stderr)。這樣的程式一樣可以使用終端機的「管線」功能,分別將標準輸出和標準錯誤的資料導給不同的Pipe Logger來處理。例如:

lovable_process > >(pipe-logger mylog.txt) 2> >(pipe-logger --err error-mylog.txt

從標準錯誤中接收訊息的Pipe Logger,可以加上「--err」選項,使其再將訊息輸出到標準錯誤中,而不是輸出到標準輸出。