Bash

使用 cron 或 logrotate 處理大量相同的日誌

  • December 16, 2015

我們在伺服器中部署了一個應用程序,在某些情況下,它會生成以下格式的一些日誌。

process_name.hostname.common_text.log.{error/info/warning}.date.time 

現在,由於這種格式,沒有一個日誌,而是幾個這樣的日誌都具有相同的***process_name.hostname.common_text.{error/info/warning}***部分,但其餘部分不同,由於日期和時間。但就 logrotate 而言,它將所有這些視為單獨的日誌,如果我說,它將保留每個日誌的 1 個這樣的副本

旋轉 1

在logrotate conf中。

但就我而言,這些都是相同的日誌,除了每個類別的最近 1 個日誌(錯誤/資訊/警告)之外,我不想保留任何日誌。我該怎麼辦?

我想編寫一個每週在 cron 中執行的腳本。此腳本將使用時間戳 ( ls -ltr )檢查每個類別 ( error/info/warning ) 中的最新文件,然後刪除其餘此類日誌。但是,如果我嘗試將它放入腳本中,它會變得太複雜。

我正在尋找這樣的東西。

ls -ltr |grep process_name.hostname.common_text.log.error |head -n -1
ls -ltr |grep process_name.hostname.common_text.log.info |head -n -1
ls -ltr |grep process_name.hostname.common_text.log.warning |head -n -1

以上 3 條命令將返回所有process_name.hostname.common_text.log.{error/info/warning}.date.time日誌的名稱,除了最近的日誌。

1)是否可以將上述每個命令的輸出傳遞給同一行中的execxargs,以便我可以針對它執行rm -rf

2)這樣做的更好方法是什麼?因為,process_name 再次有 2 個不同的名稱,所以,我必須執行 6 個命令,或者更多。

  1. 不是 grep 三次,一次是錯誤,一次是資訊,一次是警告,有什麼方法可以在一行中對所有 3 個進行 grep?

如果你使用-1而不是-lfor ls,你只會得到文件名並且可以將它們直接傳遞給 rm。我會使用這樣的東西:

rm $(ls -1tr process_name.hostname.common_text.log.error* | head -n -1) \
$(ls -1tr process_name.hostname.common_text.log.info* | head -n -1) \
$(ls -1tr process_name.hostname.common_text.log.warning* | head -n -1)

引用自:https://unix.stackexchange.com/questions/249781