[英]Set line maximum of log file
目前,我編寫了一個簡單的記錄器來記錄來自bash腳本的消息。 記錄器工作正常,我只需在日志文件中寫上日期和消息即可。 由於日志文件將增加,因此我想將記錄器的限制設置為例如1000行。 達到1000行后,它不會刪除或完全清除日志文件。 它應該截斷第一行並將其替換為新的日志行。 因此該文件保留1000行,並且不會進一步增加。 最新行應始終位於文件頂部。 有內置方法嗎? 或者我該如何解決?
您選擇的示例可能不是最好的。 正如評論所指出的那樣, logrotate
是保持日志文件大小不變的最佳工具。 此外, 生產線不是衡量尺寸的最佳單位。 這些評論者都是正確的。
但是,我以您的面值回答您的問題。
您可以通過shell內置函數實現所需的功能,但是使用sed
這樣的外部工具可以更快,更簡單地完成任務。 ( awk
是另一種選擇,但是它缺少-i
開關,在這種情況下可以簡化您的生活。)
因此,假設您的文件已經存在,並且名為script.log
則
maxlines=1000
log_msg='Whatever the log message is'
sed -i -e1i"\\$log_msg" -e$((maxlines))',$d' script.log
做你想要的。
-i
表示就地修改給定文件。 $log_msg
before the first ( 1 ) line. -e1i"\\\\$log_msg"
表示 在第一( 1 )行之前插入 $log_msg
。 $((maxlines))
to the last one ( $ ). -e$((maxlines))',$d'
是指 $((maxlines))
到最后一個($)。 為什么要用新消息替換第一行,從而導致日志文件中消息順序的跳轉,而不是僅僅刪除第一行並附加新消息,例如,簡而言之:
log() {
tail -999 logfile > tmp &&
{ cat tmp && printf '%s\n' "$*"; } > logfile
}
log "new message"
如果您的日志文件始終是小行,則甚至不需要tmp文件,只需將tail的輸出保存在變量中,然后將printf保存。
請注意,與sed -i
解決方案不同,以上內容不會更改logfile
索引節點,硬鏈接,權限或其他任何內容-它與您僅以更新內容開頭的文件相同,不會替換為新文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.