介紹
Logrotate 是一個系統工具,用於管理日誌文件的自動旋轉和壓縮。如果不對日誌文件進行旋轉、壓縮和定期修剪,它們最終可能會消耗系統上的所有可用磁盤空間。
Logrotate 預設安裝在 Ubuntu 22.04 上,並設置為處理所有已安裝套件(包括預設系統日誌處理器 rsyslog
)的日誌旋轉需求。
在本文中,我們將探討默認的 Logrotate 配置,然後為一個虛構的自定義應用程序配置日誌旋轉。
先決條件
本教程假設您擁有一台安裝了 Ubuntu 22.04 的伺服器,並擁有一個非根 sudo 啟用的使用者,如使用 Ubuntu 22.04 進行初始伺服器設置中所述。
Logrotate 也可用於許多其他 Linux 發行版,但默認配置可能會有所不同。只要您的 Logrotate 版本與 Ubuntu 22.04 的相似,本教程的其他部分仍然適用。請按照第 1 步檢查您的 Logrotate 版本。
請使用您的 sudo 啟用使用者登錄伺服器開始。
步驟 1 — 確認您的 Logrotate 版本
Logrotate 在 Ubuntu 上是預設安裝的。但是,如果您需要安裝它,請運行以下命令來更新您的套件清單並檢索套件:
如果您使用的是非 Ubuntu 伺服器,首先確保 Logrotate 已安裝,方法是請求其版本信息:
Outputlogrotate 3.19.0
Default mail command: /usr/bin/mail
Default compress command: /bin/gzip
Default uncompress command: /bin/gunzip
Default compress extension: .gz
Default state file path: /var/lib/logrotate/status
ACL support: yes
SELinux support: yes
如果 Logrotate 已安裝但版本號顯著不同,您可能會在本教程中探討的某些配置選項上遇到問題。請參考您特定版本的 Logrotate 文檔,閱讀其手冊 (man
) 頁面:
您也可以查閱 Logrotate 文檔的 在線版本。接下來,我們將查看 Ubuntu 上 Logrotate 的默認配置結構。
步驟 2 — 探索 Logrotate 配置
通常在 Ubuntu 上,Logrotate 的配置信息可以在兩個地方找到:
/etc/logrotate.conf
:此檔案包含一些預設設定,並設定了一些不屬於任何系統套件的日誌輪替。它還使用include
語句從/etc/logrotate.d
目錄中的任何文件中引入配置。/etc/logrotate.d/
:這是您安裝的任何需要幫助進行日誌輪替的套件會將其Logrotate配置放置的位置。在標準安裝中,您應該已經在這裡找到了核心系統工具的文件,如apt
、dpkg
、rsyslog
等。
默認情況下,logrotate.conf
將配置每週的日誌輪替,日誌文件由root用戶和syslog組擁有,每次保留四個日誌文件(rotate 4
),並在當前日誌文件輪替後創建新的空日誌文件(create
)。
讓我們來看一個位於/etc/logrotate.d
中的套件的Logrotate配置文件。查看apt
套件工具的文件:
Output/var/log/apt/term.log {
rotate 12
monthly
compress
missingok
notifempty
}
/var/log/apt/history.log {
rotate 12
monthly
compress
missingok
notifempty
}
此文件包含/var/log/apt/
目錄中兩個不同日誌文件的配置塊:term.log
和history.log
。它們都具有相同的選項。這些配置塊中未設置的任何選項將繼承默認值或/etc/logrotate.conf
中設置的值。日誌文件中設置的任何設置將覆蓋Logrotate的默認值,這些值在/etc/logrotate.conf
中配置。對於apt
日誌設置的選項為:
rotate 12
:保留十二個舊的日誌文件。這將覆蓋默認的rotate 4
。monthly
:每月旋轉一次。這將覆蓋默認的weekly
。compress
:壓縮旋轉後的文件。默認使用gzip
,導致文件以.gz
結尾。可以使用compresscmd
選項更改壓縮命令。missingok
:如果日誌文件丟失,不會寫入錯誤消息。notifempty
:如果日誌文件為空,不會旋轉該文件。
這些配置文件還會繼承默認的create
行為,該行為指示Logrotate在旋轉後創建新日誌。這可以使用nocreate
覆蓋,不過這會有效地禁用大部分其他功能。
還有許多其他配置選項可用。您可以通過在命令行上輸入man logrotate
來閱讀有關所有選項的信息,以打開Logrotate的手冊頁面。
接下來,我們將設置一個配置文件來處理一個名為your-app
的虛構服務的日誌。
步驟3 — 設置示例配置
要使用logrotate管理預打包和預配置系統服務以外的應用程序的日誌文件,我們有兩個選擇:
- 創建一個新的Logrotate配置文件並將其放置在
/etc/logrotate.d/
。這將作為root用戶每天運行,以及所有其他標準的Logrotate任務。 - 創建一個新的配置文件並在Ubuntu的默認Logrotate設置之外運行它。只有在需要以非root用戶運行Logrotate,或者您想要比每天更頻繁地旋轉日誌時才真正需要這樣做(在
/etc/logrotate.d/
中的每小時配置將無效,因為系統的Logrotate設置每天只運行一次)。
讓我們通過一些示例設置來逐步了解這兩個選項。
將配置添加到/etc/logrotate.d/
我們想要為一個虛構的 Web 服務器配置日誌輪換,將access.log
和error.log
放入/var/log/your-app/
。它以www-data
用戶和組運行。
為了將your-app
日誌文件的配置添加到/etc/logrotate.d/
,首先使用nano
或您喜歡的編輯器在/etc/logrotate.d
目錄中打開一個新文件:
將以下行添加到您的新配置文件中:
/var/log/your-app/*.log {
daily
missingok
rotate 14
compress
notifempty
create 0640 www-data www-data
sharedscripts
postrotate
systemctl reload your-app
endscript
}
此文件中的一些新配置指令是:
create 0640 www-data www-data
:這將在旋轉後創建一個新的空日誌文件,具有指定的權限(0640
)、擁有者(www-data
)和群組(同樣為www-data
)。sharedscripts
:此標誌表示將添加到配置的任何腳本僅運行一次,而不是對每個旋轉的文件運行。由於路徑/var/log/your-app/*.log
包含通配符*
,此配置將匹配your-app
目錄中的任意數量的日誌文件。如果沒有sharedscripts
選項,則postrotate
中指定的腳本將每次logrotate處理一個日誌文件時運行一次。postrotate
到endscript
:此塊包含在日誌文件旋轉後運行的腳本。在這種情況下,我們正在重新加載我們的示例應用程序。這有時是必要的,以使您的應用程序切換到新創建的日誌文件。
請注意,postrotate
在日誌被壓縮之前運行。壓縮可能需要很長時間,並且您的軟件應立即切換到新的日誌文件。對於需要在日誌被壓縮之後運行的任務,請改用lastaction
塊。
要保存並退出nano
,請按Ctrl+X
,然後在提示時輸入Y
,然後按Enter
。您可以通過執行dry run來測試配置文件:
此命令調用logrotate
,將其指向標準配置文件,並啟用調試模式。
關於Logrotate正在處理的日誌檔案以及它將對它們進行的操作將被列印出來。如果一切看起來都正常,你就完成了。標準的Logrotate任務將每天運行一次,並包括您的新配置。
接下來,我們將嘗試一個完全不使用Ubuntu默認配置的設置。
步驟4 — 創建獨立的Logrotate配置
在這個示例中,我們有一個應用程序以我們的用戶sammy
運行,生成的日誌存儲在/home/sammy/logs/
中。我們希望每小時輪換這些日誌,所以我們需要在Ubuntu提供的/etc/logrotate.d
結構之外進行設置。
首先,我們將在我們的家目錄中創建一個配置文件。在文本編輯器中打開它:
然後粘貼以下配置:
/home/sammy/logs/*.log {
hourly
missingok
rotate 24
compress
create
}
保存並關閉文件。我們在前幾個步驟中遇到了所有這些選項,但讓我們總結一下:此配置將每小時輪換文件,壓縮和保留二十四個舊日誌,並創建一個新的日誌文件來替換旋轉的文件。
您需要自定義配置以適應您的應用程序,但這是一個很好的開始。
為了測試配置是否正常,讓我們建立一個日誌文件。首先使用cd ~
命令切換到您用戶的主目錄。然後使用mkdir
命令創建一個用於存放日誌的目錄。最後,在logs
目錄中使用touch
命令創建一個空文件。按照以下順序運行這些命令完成這些步驟:
現在我們在正確的位置有一個空的日誌文件,讓我們運行logrotate
命令。
由於日誌的所有者是sammy
,我們不需要使用sudo
。但是,我們需要指定一個狀態文件。該文件記錄了上次logrotate
運行時發現的情況以及採取的任何操作,以便它知道下次運行時該做什麼。當使用默認的/etc/logrotate.conf
配置時,此狀態跟踪為我們處理。狀態文件存儲在/var/lib/logrotate/status
中。由於我們不使用默認配置,我們需要手動配置狀態文件位置。
我們將在本示例中讓Logrotate將狀態文件放在我們的主目錄中。它可以放在任何方便訪問的地方。運行以下命令使用您創建的/home/sammy/logrotate.conf
並記錄logrotate遇到的狀態:
logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose
Outputreading config file /home/sammy/logrotate.conf
Handling 1 logs
rotating pattern: /home/sammy/logs/*.log hourly (24 rotations)
empty log files are rotated, old logs are removed
considering log /home/sammy/logs/access.log
log does not need rotating
使用--verbose
標誌將打印有關Logrotate正在執行的詳細信息。在這種情況下,它沒有旋轉任何內容。這是Logrotate第一次遇到此日誌文件,且它的年齡為零小時,因此不應旋轉。
如果我们使用cat
实用程序检查状态文件,我们会注意到Logrotate记录了一些关于运行的信息:
Outputlogrotate state -- version 2
"/home/sammy/logs/access.log" 2022-07-2-19:0:0
Logrotate记录了它看到的日志以及上次考虑对它们进行旋转的时间。如果我们在一小时后运行相同的命令,日志将按预期进行旋转。
如果您想要强制Logrotate在否则不会旋转日志文件的情况下进行旋转,请使用--force
标志:
这在测试postrotate
和其他脚本时非常有用。
最后,我们需要设置一个cron作业,每小时运行一次Logrotate。打开您用户的crontab:
这将打开一个文本文件。如果这是您第一次使用cron,可能会提示您选择默认的文本编辑器。如果您没有偏好,我们建议新用户使用nano
。文件中可能已经有一些注释,解释了cron语法。将光标移动到文件末尾的新空白行处,并添加以下内容:
crontab14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state
此任务将在每小时的第14分钟运行,每天都运行。它几乎运行与我们之前运行的logrotate
命令相同,尽管我们将logrotate
扩展到其完整路径/usr/sbin/logrotate
以确保安全。编写cron作业时最好使用完整路径。要了解有关cron的更多信息,您可以查看我们的其他教程。
保存文件并退出。这将安装crontab,并且我们的任务将按指定的计划运行。
如果我們大約再過一小時重新查看日誌目錄,我們應該會找到已輪換並壓縮的日誌文件access.log.1.gz
(如果你使用了--force
標誌運行 Logrotate,則可能是.2.gz
)。
結論
在本教程中,我們驗證了我們的 Logrotate 版本,探索了默認的 Ubuntu Logrotate 配置,並設置了兩種不同類型的自定義配置。要了解更多有關 Logrotate 的命令行和配置選項,您可以通過在終端中運行man logrotate
或訪問在線文檔來閱讀其手冊頁面。