使用 logrotate 命令輪轉(zhuǎn)和歸檔日志
使用此 Linux 命令保持日志文件更新。
日志非常適合找出應(yīng)用程序在做什么或?qū)赡艿膯?wèn)題進(jìn)行故障排除。幾乎我們處理的每個(gè)應(yīng)用程序都會(huì)生成日志,我們希望我們自己開(kāi)發(fā)的應(yīng)用程序也生成日志。日志越詳細(xì),我們擁有的信息就越多。但放任不管,日志可能會(huì)增長(zhǎng)到無(wú)法管理的大小,反過(guò)來(lái),它們可能會(huì)成為它們自己的問(wèn)題。因此,最好將它們進(jìn)行裁剪,保留我們需要的那些,并將其余的歸檔。
基本功能
logrotate
實(shí)用程序在管理日志方面非常出色。它可以輪轉(zhuǎn)日志、壓縮日志、通過(guò)電子郵件發(fā)送日志、刪除日志、歸檔日志,并在你需要時(shí)開(kāi)始記錄最新的。
運(yùn)行 logrotate
非常簡(jiǎn)單——只需要運(yùn)行 logrotate -vs state-file config-file
。在上面的命令中,v
選項(xiàng)開(kāi)啟詳細(xì)模式,s
指定一個(gè)狀態(tài)文件,最后的 config-file
是配置文件,你可以指定需要做什么。
實(shí)戰(zhàn)演練
讓我們看看在我們的系統(tǒng)上靜默運(yùn)行的 logrotate
配置,它管理我們?cè)?nbsp;/var/log
目錄中找到的大量日志。查看該目錄中的當(dāng)前文件。你是否看到很多 *.[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
}
該文件首先定義了輪轉(zhuǎn) /var/log/syslog
文件的說(shuō)明,這些說(shuō)明包含在后面的花括號(hào)中。以下是它們的含義:
rotate 7
: 保留最近 7 次輪轉(zhuǎn)的日志。然后開(kāi)始刪除超出的。daily
: 每天輪轉(zhuǎn)日志,與rotate 7
一起使用,這意味著日志將保留過(guò)去 7 天。其它選項(xiàng)是每周、每月、每年。還有一個(gè)大小參數(shù),如果日志文件的大小增加超過(guò)指定的限制(例如,大小 10k、大小 10M、大小 10G 等),則將輪轉(zhuǎn)日志文件。如果未指定任何內(nèi)容,日志將在運(yùn)行logrotate
時(shí)輪轉(zhuǎn)。你甚至可以在 cron 中運(yùn)行logrotate
以便在更具體的時(shí)間間隔內(nèi)使用它。missingok
: 如果日志文件缺失也沒(méi)關(guān)系。不要驚慌。notifempty
: 日志文件為空時(shí)不輪轉(zhuǎn)。compress
: 開(kāi)啟壓縮,使用nocompress
關(guān)閉它。delaycompress
: 如果壓縮已打開(kāi),則將壓縮延遲到下一次輪轉(zhuǎn)。這允許至少存在一個(gè)輪轉(zhuǎn)但未壓縮的文件。如果你希望昨天的日志保持未壓縮以便進(jìn)行故障排除,那么此配置會(huì)很有用。如果某些程序在重新啟動(dòng)/重新加載之前可能仍然寫(xiě)入舊文件,這也很有幫助,例如 Apache。postrotate/endscript
: 輪轉(zhuǎn)后運(yùn)行此部分中的腳本。有助于做清理工作。還有一個(gè)prerotate/endscript
用于在輪轉(zhuǎn)開(kāi)始之前執(zhí)行操作。
你能弄清楚下一節(jié)對(duì)上面配置中提到的所有文件做了什么嗎?第二節(jié)中唯一多出的參數(shù)是 sharedscripts
,它告訴 logrotate
在所有日志輪轉(zhuǎn)完成之前不要運(yùn)行 postrotate/endscript
中的部分。它可以防止腳本在每一次輪轉(zhuǎn)時(shí)執(zhí)行,只在最后一次輪轉(zhuǎn)完成時(shí)執(zhí)行。
看點(diǎn)新的東西
我使用下面的配置來(lái)處理我系統(tǒng)上的 Nginx
的訪問(wèn)和錯(cuò)誤日志。
/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
}
上面的腳本可以使用如下命令運(yùn)行:
logrotate -vs state-file /tmp/logrotate
第一次運(yùn)行該命令會(huì)給出以下輸出:
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
第二次運(yùn)行它:
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
第三次運(yùn)行它:
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
狀態(tài)文件的內(nèi)容如下所示:
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