如何在 Ubuntu 22.04 上使用 Logrotate 管理日志文件

介紹

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 上是預設安裝的。但是,如果您需要安裝它,請運行以下命令來更新您的套件清單並檢索套件:

  1. sudo apt update
  2. sudo apt install logrotate

如果您使用的是非 Ubuntu 伺服器,首先確保 Logrotate 已安裝,方法是請求其版本信息:

  1. logrotate --version
Output
logrotate 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) 頁面:

  1. man logrotate

您也可以查閱 Logrotate 文檔的 在線版本。接下來,我們將查看 Ubuntu 上 Logrotate 的默認配置結構。

步驟 2 — 探索 Logrotate 配置

通常在 Ubuntu 上,Logrotate 的配置信息可以在兩個地方找到:

  • /etc/logrotate.conf:此檔案包含一些預設設定,並設定了一些不屬於任何系統套件的日誌輪替。它還使用include語句從/etc/logrotate.d目錄中的任何文件中引入配置。
  • /etc/logrotate.d/:這是您安裝的任何需要幫助進行日誌輪替的套件會將其Logrotate配置放置的位置。在標準安裝中,您應該已經在這裡找到了核心系統工具的文件,如aptdpkgrsyslog等。

默認情況下,logrotate.conf將配置每週的日誌輪替,日誌文件由root用戶和syslog組擁有,每次保留四個日誌文件(rotate 4),並在當前日誌文件輪替後創建新的空日誌文件(create)。

讓我們來看一個位於/etc/logrotate.d中的套件的Logrotate配置文件。查看apt套件工具的文件:

  1. cat /etc/logrotate.d/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.loghistory.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管理預打包和預配置系統服務以外的應用程序的日誌文件,我們有兩個選擇:

  1. 創建一個新的Logrotate配置文件並將其放置在/etc/logrotate.d/。這將作為root用戶每天運行,以及所有其他標準的Logrotate任務。
  2. 創建一個新的配置文件並在Ubuntu的默認Logrotate設置之外運行它。只有在需要以非root用戶運行Logrotate,或者您想要比每天更頻繁地旋轉日誌時才真正需要這樣做(在/etc/logrotate.d/中的每小時配置將無效,因為系統的Logrotate設置每天只運行一次)。

讓我們通過一些示例設置來逐步了解這兩個選項。

將配置添加到/etc/logrotate.d/

我們想要為一個虛構的 Web 服務器配置日誌輪換,將access.logerror.log放入/var/log/your-app/。它以www-data用戶和組運行。

為了將your-app日誌文件的配置添加到/etc/logrotate.d/,首先使用nano或您喜歡的編輯器在/etc/logrotate.d目錄中打開一個新文件:

  1. sudo nano /etc/logrotate.d/your-app

將以下行添加到您的新配置文件中:

/etc/logrotate.d/your-app
/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處理一個日誌文件時運行一次。
  • postrotateendscript:此塊包含在日誌文件旋轉後運行的腳本。在這種情況下,我們正在重新加載我們的示例應用程序。這有時是必要的,以使您的應用程序切換到新創建的日誌文件。
    請注意,postrotate在日誌被壓縮之前運行。壓縮可能需要很長時間,並且您的軟件應立即切換到新的日誌文件。對於需要在日誌被壓縮之後運行的任務,請改用lastaction塊。

要保存並退出nano,請按Ctrl+X,然後在提示時輸入Y,然後按Enter。您可以通過執行dry run來測試配置文件:

  1. sudo logrotate /etc/logrotate.conf --debug

此命令調用logrotate,將其指向標準配置文件,並啟用調試模式。

關於Logrotate正在處理的日誌檔案以及它將對它們進行的操作將被列印出來。如果一切看起來都正常,你就完成了。標準的Logrotate任務將每天運行一次,並包括您的新配置。

接下來,我們將嘗試一個完全不使用Ubuntu默認配置的設置。

步驟4 — 創建獨立的Logrotate配置

在這個示例中,我們有一個應用程序以我們的用戶sammy運行,生成的日誌存儲在/home/sammy/logs/中。我們希望每小時輪換這些日誌,所以我們需要在Ubuntu提供的/etc/logrotate.d結構之外進行設置。

首先,我們將在我們的家目錄中創建一個配置文件。在文本編輯器中打開它:

  1. nano /home/sammy/logrotate.conf

然後粘貼以下配置:

/home/sammy/logrotate.conf
/home/sammy/logs/*.log {
	hourly
	missingok
	rotate 24
	compress
	create
}

保存並關閉文件。我們在前幾個步驟中遇到了所有這些選項,但讓我們總結一下:此配置將每小時輪換文件,壓縮和保留二十四個舊日誌,並創建一個新的日誌文件來替換旋轉的文件。

您需要自定義配置以適應您的應用程序,但這是一個很好的開始。

為了測試配置是否正常,讓我們建立一個日誌文件。首先使用cd ~命令切換到您用戶的主目錄。然後使用mkdir命令創建一個用於存放日誌的目錄。最後,在logs目錄中使用touch命令創建一個空文件。按照以下順序運行這些命令完成這些步驟:

  1. cd ~
  2. mkdir logs
  3. touch logs/access.log

現在我們在正確的位置有一個空的日誌文件,讓我們運行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
Output
reading 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记录了一些关于运行的信息:

  1. cat /home/sammy/logrotate-state
Output
logrotate state -- version 2 "/home/sammy/logs/access.log" 2022-07-2-19:0:0

Logrotate记录了它看到的日志以及上次考虑对它们进行旋转的时间。如果我们在一小时后运行相同的命令,日志将按预期进行旋转。

如果您想要强制Logrotate在否则不会旋转日志文件的情况下进行旋转,请使用--force标志:

  1. logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose --force

这在测试postrotate和其他脚本时非常有用。

最后,我们需要设置一个cron作业,每小时运行一次Logrotate。打开您用户的crontab:

  1. crontab -e

这将打开一个文本文件。如果这是您第一次使用cron,可能会提示您选择默认的文本编辑器。如果您没有偏好,我们建议新用户使用nano。文件中可能已经有一些注释,解释了cron语法。将光标移动到文件末尾的新空白行处,并添加以下内容:

crontab
14 * * * * /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或訪問在線文檔來閱讀其手冊頁面。

Source:
https://www.digitalocean.com/community/tutorials/how-to-manage-logfiles-with-logrotate-on-ubuntu-22-04