Logging

同時將輸出附加到文件中,將其截斷為 N 行

  • October 14, 2019

我正在嘗試找到一種簡單的方法來追加/寫入日誌,同時將日誌修剪到合理的大小。我寧願不只是永遠追加文件,然後必須有一個清理日誌腳本。如果不使用第二個文件作為臨時持有者,我無法理解如何優雅地完成此任務。

我看過的東西以供參考:

我已經閱讀了高級腳本指南 http://tldp.org/LDP/abs/html/io-redirection.html

兩個命令的組合輸出: Bash - 如何將兩個命令輸出到文件?

理想情況下,我會有類似的東西(我知道這不起作用)

(tail-n 1000 foo.log; ./foo.sh) > foo.log

這將保留我正在進行的日誌中的最後 1000 行,然後將我的新輸出附加到目前執行的 foo.sh 中。

我想不出一種方法來使用附加重定向>>並限制原始文件而不將對 foo.sh 的呼叫包裝在其他 bar.sh 中

tail -n 1000 foo.log > tmp.log
mv tmp.log foo.log
./foo.sh >> foo.log

這看起來很笨拙。

也許我的答案是讓 foo.sh 不依賴 STDOUT 作為發送日誌消息的地方,而是直接打開文件。

跟進編輯:

普遍的意見是不建議這樣做。我很欣賞的意見。但是,正在發生的伺服器超出了我的控制範圍,並且不會真正處於……警惕的管理員之下。它是一個盒子,許多不同的群體擁有盒子的一部分,但沒有人對盒子的整體健康負責。我可以讓日誌永遠建立,而且在時間充裕的情況下可能並不重要,但我想盡我所能來控制它,因為我知道最終管理員不會做任何事情。所以,使用 crontab 來執行 logrotate 對我來說不合適。我只是在尋找可以用單個命令的有限點做的事情。

如果您的版本sed--in-place開關,您可以使用它。它仍然可以cpmv但它在幕後,因此腳本看起來不會那麼混亂,具體取決於您對sed語法的感覺。否則,您的tail(您在編輯中錯過了一個)和附加方法是我處理它的方式。

另一種使用方法sed是讓您的日誌倒置,並在開頭使用最新條目。

sed -ni '1s/^/New Entry\n/;100q;p' logfile

這就是它的全部內容(除了讓“新條目”成為你想要的東西)。這將使滾動的 100 行日誌文件按時間倒序排列。優點是您不必知道文件中有多少行(tail為您處理此問題,但sed不會)。這在某種程度上假設您的日誌條目由單行組成。如果您從腳本記錄大量輸出,我認為您將返回tail並追加。

另一個可能適用於詳細的多行輸出的選項是讓文件系統為您完成工作。每個日誌條目將是一個單獨的文件。

#!/bin/bash
# *** UNTESTED ***
logdir="/path/to/your/log/dir"

# run the script and log its output to a file named with the date and time
script > "$logdir/$(date "+%Y%m%dT%H%M%S").log"

# maintain the logs
# keep the last 100 days of daily logfiles
# (you could keep the last 100 hours of hourly logfiles, for example,
# by using -mmin and doing some math)

# the count is intended to keep old entries from being deleted
# leaving you with nothing if there are no new entries
count=$(find "$logdir" -maxdepth 1 -type f | wc -l)
if (( count > 100 )) 
then
   find "$logdir" -maxdepth 1 -type f -mtime +100 -delete
fi

引用自:https://serverfault.com/questions/177473