如何理解 logrotate 實用工具?請收下這份保姆級教程

Linksla發表於2023-01-17
當你想對一個應用程式跟蹤使用狀況或者進行故障排除的時候,日誌是十分有用的。然而,隨著越來越多的資訊被記錄,日誌檔案佔據的硬碟空間也會越來越大。久而久之,一個日誌檔案能變得相當的大。一個巨大的日誌檔案不但會導致硬碟空間不足,還可能減慢對虛擬伺服器調整大小或備份的過程。除此之外,你很難在一百萬條日誌中查詢某個特定事件。因此,最好將日誌檔案的大小控制在可管理的範圍內,並在日誌檔案過舊以致無法使用時對其進行刪除。

所幸,logrotate 工具讓日誌輪換(log rotation)變得簡單。“日誌輪換”指的是歸檔應用程式的當前日誌、啟動新日誌並刪除舊日誌的做法。系統通常每天執行一次 logrotate,並且在執行時會檢查可以基於每個目錄或日誌進行自定義的規則。

logrotate 工作原理

系統按計劃執行 logrotate,一般來說是每天。在大多數發行版中,每天執行 logrotate 的指令碼位於 /etc/cron.daily/logrotate 中。也有一些發行版不太一樣。比如,在 Gentoo 中,logrotate 指令碼位於 /etc/cron.daily/logrotate.cron。如果你想更頻繁地執行 logrotate(比如每小時),那你需要使用 cron 透過 /etc/cron.hourly 下的指令碼執行 logrotate。當 logrotate 執行時,它將讀取其配置檔案,以確定需要輪換的日誌檔案位置、需要輪換的頻率以及需要保留的歸檔日誌的數量。

logrotate.conf

logrotate 的主要配置檔案存放在 /etc/logrotate.conf。這個檔案包含 logrotate 在輪換日誌時使用的預設引數。這個檔案包含註釋,所以你可以瀏覽一下看看是如何配置的。本文稍後將描述該檔案中的幾個特定命令。注意檔案有一行如下:

    include /etc/logrotate.d

    這個目錄包含大多數特定應用程式(application-specific)的配置檔案。

    logrotate.d

    使用以下命令列出包含特定應用程式日誌配置的目錄內容:

    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 檔案中繼承預設配置。

    Log files

    透過列出一個(或多個)日誌檔案,然後列出用大括號括起來的一組命令來定義日誌檔案及其輪換行為。大多數應用程式配置檔案只包含這些塊(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 count

    rotate 命令確定在 logrotate 開始刪除較舊的日誌之前,返回多少歸檔日誌。例如:

    rotate 4

    這個命令告訴 logrotate 一次保留 4 個歸檔日誌。當日志再次被輪換時,如果已經有 4 個歸檔日誌了,最老的將被刪除以給新的歸檔留出空間。

    Rotation interval

    你可以指定一個命令來告訴 logrotate 多久來輪換特定日誌。合理的命令包括:

    dailyweeklymonthlyyearly

    如果沒有指定輪換間隔,則日誌在每次 logrotate 執行時都會被輪換(除非設定了比如 size 等其他命令)。
    如果要使用除定義的時間間隔以外的時間間隔,則需要使用 cron 建立單獨的配置檔案。例如,如果你想每小時輪換特定的日誌檔案,你可以在 /etc/cron.hourly 下建立一個檔案(你可能還需要建立這個目錄),包含如下的一行內容:

    /usr/sbin/logrotate /etc/logrotate.hourly.conf

    然後,將需要每小時執行一次的 logrotate 配置(日誌檔案位置、是否要壓縮舊檔案等)放入 /etc/logrotate.hourly.conf 中。

    Size

    你可以使用 size 命令為 logrotate 指定檔案大小,以便在確定是否執行輪換時進行檢查。命令的格式告訴 logrotate 你用來指定大小的單位是什麼:

      size 100ksize 100Msize 100G
      第一個示例將在日誌大於 100KB 時輪換日誌,第二個示例大於 100MB,第三個示例大於 100GB。我不建議使用 100G 的限制,提醒你一下,這個示例有些失控。如果同時設定了大小和輪換間隔,則 size 命令具有更高優先順序並取代輪換間隔。

      Compression

      如果你想壓縮歸檔的日誌檔案(使用 gzip 格式),你可以包含以下命令,這一般在 /etc/logrotate.conf 中有:

      compress

      壓縮通常是一個好主意,因為日誌檔案通常是所有文字,而文字能很好地壓縮。但是,如果你有一些不想壓縮的歸檔日誌,但你又希望預設情況下啟用壓縮,則可以在特定於應用程式的配置中包括以下命令:

      nocompress

      關於壓縮的另一個需要注意的命令如下:

      delaycompress

      這個命令在你想壓縮歸檔檔案,但又想推遲壓縮時很有用。當 delaycompress 開啟時,歸檔日誌會在日誌下次輪換時被壓縮。當你有一個程式,在輪換了新日誌檔案之後仍可能在一段時間內寫入其舊日誌檔案時,這一點可能很重要。注意 delaycompress 只有在你配置了 compress 時才生效。一個很好的使用 delaycompress 的例子是,當 logrotate 被告知使用 “graceful” 或 “reload” 指令重啟 Apache 時。因為舊的 Apache 程式直到連線完成才結束,所以它們可能會在重新啟動後的一段時間內嘗試將更多項記錄到舊檔案中。延遲壓縮可確保在輪換日誌時不會丟失這些額外的日誌條目。

      Postrotate

      Logrotate 在每次輪換配置塊中指定的日誌時會執行 postrotate 指令碼。通常,你希望在輪換日誌後使用這個指令碼重新啟動應用程式,以便該應用程式可以切換到新日誌。

      postrotate    /usr/sbin/apachectl restart > /dev/nullendscript

      > /dev/null  告知 logrotate 丟棄命令的輸出。在這個例子裡,你不需要檢視應用程式重啟成功的輸出。

      Sharedscripts

      通常 logrotate 在每次輪換完一個日誌後都會執行 postrotate 指令碼。對於使用同一配置塊的多個日誌也是如此。舉個例子,同時引用訪問日誌和錯誤日誌的 Web 服務配置塊,如果它兩個都要輪換,將執行兩次 postrotate 指令碼(每次輪換檔案時一次)。如果兩個檔案都輪換了,則 Web 服務將重新啟動兩次。為了防止logrotate為每個日誌執行該指令碼,可以包括以下命令:

      sharedscripts

      此命令告訴 logrotate 在執行 postrotate 指令碼之前檢查該配置塊的所有日誌。如果一個輪換或這兩個都輪換了,則 postrotate 指令碼僅執行一次。如果沒有日誌輪換,則後輪轉指令碼不會執行。

      接下來去哪裡

      本文概述了 logrotate 的功能以及可用的配置選項。現在,你應該能夠瀏覽現有配置並使其適應你的需求。要了解如何建立示例配置(輪換自定義虛擬主機的日誌),參考 Sample logrotate configurations and troubleshooting。

      連結:


      來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70013542/viewspace-2932406/,如需轉載,請註明出處,否則將追究法律責任。

      相關文章