簡體   English   中英

設置日志文件的最大行數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM