
當你想對一個應用程序跟蹤使用狀況或者進行故障排除的時候,日志是十分有用的。然而,隨著越來越多的信息被記錄,日志文件占據的硬盤空間也會越來越大。久而久之,一個日志文件能變得相當的大。一個巨大的日志文件不但會導致硬盤空間不足,還可能減慢對虛擬服務器調整大小或備份的過程。除此之外,你很難在一百萬條日志中查找某個特定事件。因此,最好將日志文件的大小控制在可管理的范圍內,并在日志文件過舊以致無法使用時對其進行刪除。
(資料圖)
所幸,logrotate 工具讓日志輪換(log rotation)變得簡單。“日志輪換”指的是歸檔應用程序的當前日志、啟動新日志并刪除舊日志的做法。系統通常每天運行一次 logrotate,并且在運行時會檢查可以基于每個目錄或日志進行自定義的規則。
系統按計劃運行 logrotate,一般來說是每天。在大多數發行版中,每天運行 logrotate 的腳本位于 /etc/cron.daily/logrotate 中。也有一些發行版不太一樣。比如,在 Gentoo 中,logrotate 腳本位于 /etc/cron.daily/logrotate.cron。如果你想更頻繁地運行 logrotate(比如每小時),那你需要使用 cron 通過 /etc/cron.hourly 下的腳本運行 logrotate。當 logrotate 運行時,它將讀取其配置文件,以確定需要輪換的日志文件位置、需要輪換的頻率以及需要保留的歸檔日志的數量。
logrotate 的主要配置文件存放在 /etc/logrotate.conf。這個文件包含 logrotate 在輪換日志時使用的默認參數。這個文件包含注釋,所以你可以瀏覽一下看看是如何配置的。本文稍后將描述該文件中的幾個特定命令。注意文件有一行如下:
include /etc/logrotate.d
這個目錄包含大多數特定應用程序(application-specific)的配置文件。
使用以下命令列出包含特定應用程序日志配置的目錄內容:
ls /etc/logrotate.d
這個目錄下可能沒有文件或者有多個文件,這取決于你的服務器安裝了多少東西。一般來說,通過你的包管理器安裝的應用程序會在 /etc/logrotate.d 中創建一個配置文件。通常,這個目錄包含一個用于 syslog 服務的配置文件,這個文件會在 logrotate 輪換系統日志時讀取。這個文件包含各種系統日志的條目,以及一些類似于 logrotate.conf 包含的命令。
注意:在 Karmic Koala(9.10)之前的 Ubuntu 操作系統版本中,沒有用于 syslog 服務的條目。在該發行版之前,系統日志是通過從 /etc/cron.daily/sysklogd 腳本中運行的 savelog 命令來輪換的。
舉個例子,考慮有這么個 logrotate 配置文件,它可能是當你在 Fedora 系統上安裝 Apache 時放置的:
/var/log/httpd/*log { missingok notifempty sharedscripts postrotate /sbin/service httpd reload > /dev/null 2>/dev/null || true endscript }
當 logrotate 運行時,它會檢查 /var/log/httpd 下所有以 log 結尾的、不為空的文件并輪換它們。如果它在 httpd 目錄下沒有找到任何日志文件,它不會產生一個異常。接著它會執行 postrotate/endscript 塊中的命令(在這個例子里,是一個通知 Apache 重啟的命令),但只會在它處理完所有指定日志之后才會執行。
這個示例文件沒有包含 logrotate.conf 文件中的某些配置。logrotate.conf 中的命令充當日志輪換的默認配置。當你想覆蓋默認配置時,你可以為任意應用程序指定不同的。例如,當你有一個比較忙的 web 服務時,你可能想在 Apache 的配置塊中引入 daily 命令,這樣 Apache 的日志會按天輪換,而不是默認的按周輪換。
下一節將介紹一些在 logrotate 配置文件中實際執行的更常用的命令。
你可以通過 man 手冊查看 logrotate 配置文件使用的完整命令列表:
man logrotate
這一節介紹更常用的命令。
請記住,/etc/logrotate.d 中的應用程序配置文件從 /etc/logrotate.conf 文件中繼承默認配置。
通過列出一個(或多個)日志文件,然后列出用大括號括起來的一組命令來定義日志文件及其輪換行為。大多數應用程序配置文件只包含這些塊(block)之一,不過也可以在文件中放置多個塊,或者把日志文件塊放到 logrotate.conf 文件中去。
你可以通過在名稱中使用通配符,或者使用空格分隔日志文件來在一個塊中列出多個日志文件。例如,指定 /var/foo 下所有以 .log 結尾的文件以及 /var/bar/log.txt 文件,你可以如下設置這個塊:
/var/foo/*.log /var/bar/log.txt { rotate 14 daily compress delaycompress sharedscripts postrotate /usr/sbin/apachectl graceful > /dev/null Endscript}
rotate 命令確定在 logrotate 開始刪除較舊的日志之前,返回多少歸檔日志。例如:
rotate 4
這個命令告訴 logrotate 一次保留 4 個歸檔日志。當日志再次被輪換時,如果已經有 4 個歸檔日志了,最老的將被刪除以給新的歸檔留出空間。
你可以指定一個命令來告訴 logrotate 多久來輪換特定日志。合理的命令包括:
dailyweeklymonthlyyearly
如果沒有指定輪換間隔,則日志在每次 logrotate 運行時都會被輪換(除非設置了比如 size 等其他命令)。
如果要使用除定義的時間間隔以外的時間間隔,則需要使用 cron 創建單獨的配置文件。例如,如果你想每小時輪換特定的日志文件,你可以在 /etc/cron.hourly 下創建一個文件(你可能還需要創建這個目錄),包含如下的一行內容:
/usr/sbin/logrotate /etc/logrotate.hourly.conf
然后,將需要每小時運行一次的 logrotate 配置(日志文件位置、是否要壓縮舊文件等)放入 /etc/logrotate.hourly.conf 中。
你可以使用 size 命令為 logrotate 指定文件大小,以便在確定是否執行輪換時進行檢查。命令的格式告訴 logrotate 你用來指定大小的單位是什么:
size 100ksize 100Msize 100G
第一個示例將在日志大于 100KB 時輪換日志,第二個示例大于 100MB,第三個示例大于 100GB。我不建議使用 100G 的限制,提醒你一下,這個示例有些失控。如果同時設置了大小和輪換間隔,則 size 命令具有更高優先級并取代輪換間隔。
如果你想壓縮歸檔的日志文件(使用 gzip 格式),你可以包含以下命令,這一般在 /etc/logrotate.conf 中有:
compress
壓縮通常是一個好主意,因為日志文件通常是所有文本,而文本能很好地壓縮。但是,如果你有一些不想壓縮的歸檔日志,但你又希望默認情況下啟用壓縮,則可以在特定于應用程序的配置中包括以下命令:
nocompress
關于壓縮的另一個需要注意的命令如下:
delaycompress
這個命令在你想壓縮歸檔文件,但又想推遲壓縮時很有用。當 delaycompress 開啟時,歸檔日志會在日志下次輪換時被壓縮。當你有一個程序,在輪換了新日志文件之后仍可能在一段時間內寫入其舊日志文件時,這一點可能很重要。注意 delaycompress 只有在你配置了 compress 時才生效。一個很好的使用 delaycompress 的例子是,當 logrotate 被告知使用 “graceful” 或 “reload” 指令重啟 Apache 時。因為舊的 Apache 進程直到連接完成才結束,所以它們可能會在重新啟動后的一段時間內嘗試將更多項記錄到舊文件中。延遲壓縮可確保在輪換日志時不會丟失這些額外的日志條目。
Logrotate 在每次輪換配置塊中指定的日志時會執行 postrotate 腳本。通常,你希望在輪換日志后使用這個腳本重新啟動應用程序,以便該應用程序可以切換到新日志。
postrotate /usr/sbin/apachectl restart > /dev/nullendscript
??> /dev/null?
?告知 logrotate 丟棄命令的輸出。在這個例子里,你不需要查看應用程序重啟成功的輸出。
通常 logrotate 在每次輪換完一個日志后都會執行 postrotate 腳本。對于使用同一配置塊的多個日志也是如此。舉個例子,同時引用訪問日志和錯誤日志的 Web 服務配置塊,如果它兩個都要輪換,將運行兩次 postrotate 腳本(每次輪換文件時一次)。如果兩個文件都輪換了,則 Web 服務將重新啟動兩次。為了防止logrotate為每個日志運行該腳本,可以包括以下命令:
sharedscripts
此命令告訴 logrotate 在運行 postrotate 腳本之前檢查該配置塊的所有日志。如果一個輪換或這兩個都輪換了,則 postrotate 腳本僅運行一次。如果沒有日志輪換,則后輪轉腳本不會運行。
鏈接:???https://juejin.cn/post/6870025365281046542??