Linux中國

使用 logrotate 命令輪轉和歸檔日誌

日誌非常適合找出應用程序在做什麼或對可能的問題進行故障排除。幾乎我們處理的每個應用程序都會生成日誌,我們希望我們自己開發的應用程序也生成日誌。日誌越詳細,我們擁有的信息就越多。但放任不管,日誌可能會增長到無法管理的大小,反過來,它們可能會成為它們自己的問題。因此,最好將它們進行裁剪,保留我們需要的那些,並將其餘的歸檔。

基本功能

logrotate 實用程序在管理日誌方面非常出色。它可以輪轉日誌、壓縮日誌、通過電子郵件發送日誌、刪除日誌、歸檔日誌,並在你需要時開始記錄最新的。

運行 logrotate 非常簡單——只需要運行 logrotate -vs state-file config-file。在上面的命令中,v 選項開啟詳細模式,s 指定一個狀態文件,最後的 config-file 是配置文件,你可以指定需要做什麼。

實戰演練

讓我們看看在我們的系統上靜默運行的 logrotate 配置,它管理我們在 /var/log 目錄中找到的大量日誌。查看該目錄中的當前文件。你是否看到很多 *.[number].gz 文件?這就是 logrotate 正在做的。你可以在 /etc/logrotate.d/rsyslog 下找到此配置文件。我的配置文件如下:

/var/log/syslog
{
        rotate 7
        daily
        missingok
        notifempty
        delaycompress
        compress
        postrotate
                reload rsyslog > /dev/null 2>&1 || true
        endscript
}

/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages

{
        rotate 4
        weekly
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
        postrotate
                reload rsyslog > /dev/null 2>&1 || true
        endscript
}

該文件首先定義了輪轉 /var/log/syslog 文件的說明,這些說明包含在後面的花括弧中。以下是它們的含義:

  • rotate 7: 保留最近 7 次輪轉的日誌。然後開始刪除超出的。
  • daily: 每天輪轉日誌,與 rotate 7 一起使用,這意味著日誌將保留過去 7 天。其它選項是每周、每月、每年。還有一個大小參數,如果日誌文件的大小增加超過指定的限制(例如,大小 10k、大小 10M、大小 10G 等),則將輪轉日誌文件。如果未指定任何內容,日誌將在運行 logrotate 時輪轉。你甚至可以在 cron 中運行 logrotate 以便在更具體的時間間隔內使用它。
  • missingok: 如果日誌文件缺失也沒關係。不要驚慌。
  • notifempty: 日誌文件為空時不輪轉。
  • compress: 開啟壓縮,使用 nocompress 關閉它。
  • delaycompress: 如果壓縮已打開,則將壓縮延遲到下一次輪轉。這允許至少存在一個輪轉但未壓縮的文件。如果你希望昨天的日誌保持未壓縮以便進行故障排除,那麼此配置會很有用。如果某些程序在重新啟動/重新載入之前可能仍然寫入舊文件,這也很有幫助,例如 Apache。
  • postrotate/endscript: 輪轉後運行此部分中的腳本。有助於做清理工作。還有一個 prerotate/endscript 用於在輪轉開始之前執行操作。

你能弄清楚下一節對上面配置中提到的所有文件做了什麼嗎?第二節中唯一多出的參數是 sharedscripts,它告訴 logrotate 在所有日誌輪轉完成之前不要運行 postrotate/endscript 中的部分。它可以防止腳本在每一次輪轉時執行,只在最後一次輪轉完成時執行。

看點新的東西

我使用下面的配置來處理我系統上的 Nginx 的訪問和錯誤日誌。

/var/log/nginx/access.log
/var/log/nginx/error.log  {
        size 1
        missingok
        notifempty
        create 544 www-data adm
        rotate 30
        compress
        delaycompress
        dateext
        dateformat -%Y-%m-%d-%s
        sharedscripts
        extension .log
        postrotate
                service nginx reload
        endscript
}

上面的腳本可以使用如下命令運行:

logrotate -vs state-file /tmp/logrotate

第一次運行該命令會給出以下輸出:

reading config file /tmp/logrotate
extension is now .log

Handling 1 logs

rotating pattern: /var/log/nginx/access.log
/var/log/nginx/error.log   1 bytes (30 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/nginx/access.log
  log needs rotating
considering log /var/log/nginx/error.log
  log does not need rotating
rotating log /var/log/nginx/access.log, log->rotateCount is 30
Converted ' -%Y-%m-%d-%s' -> '-%Y-%m-%d-%s'
dateext suffix '-2021-08-27-1485508250'
glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding logs to compress failed
glob finding old rotated logs failed
renaming /var/log/nginx/access.log to /var/log/nginx/access-2021-08-27-1485508250.log
creating new /var/log/nginx/access.log mode = 0544 uid = 33 gid = 4
running postrotate script
* Reloading nginx configuration nginx

第二次運行它:

reading config file /tmp/logrotate
extension is now .log

Handling 1 logs

rotating pattern: /var/log/nginx/access.log
/var/log/nginx/error.log   1 bytes (30 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/nginx/access.log
  log needs rotating
considering log /var/log/nginx/error.log
  log does not need rotating
rotating log /var/log/nginx/access.log, log->rotateCount is 30
Converted ' -%Y-%m-%d-%s' -> '-%Y-%m-%d-%s'
dateext suffix '-2021-08-27-1485508280'
glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
compressing log with: /bin/gzip
renaming /var/log/nginx/access.log to /var/log/nginx/access-2021-08-27-1485508280.log
creating new /var/log/nginx/access.log mode = 0544 uid = 33 gid = 4
running postrotate script
* Reloading nginx configuration nginx

第三次運行它:

reading config file /tmp/logrotate
extension is now .log

Handling 1 logs

rotating pattern: /var/log/nginx/access.log
/var/log/nginx/error.log   1 bytes (30 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/nginx/access.log
  log needs rotating
considering log /var/log/nginx/error.log
  log does not need rotating
rotating log /var/log/nginx/access.log, log->rotateCount is 30
Converted ' -%Y-%m-%d-%s' -> '-%Y-%m-%d-%s'
dateext suffix '-2021-08-27-1485508316'
glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
compressing log with: /bin/gzip
renaming /var/log/nginx/access.log to /var/log/nginx/access-2021-08-27-1485508316.log
creating new /var/log/nginx/access.log mode = 0544 uid = 33 gid = 4
running postrotate script
* Reloading nginx configuration nginx

狀態文件的內容如下所示:

logrotate state -- version 2
"/var/log/nginx/error.log" 2021-08-27-9:0:0
"/var/log/nginx/access.log" 2021-08-27-9:11:56

本文首發於作者個人博客,經授權改編。

via: https://opensource.com/article/21/10/linux-logrotate

作者:Ayush Sharma 選題:lujun9972 譯者:perfiffer 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國