Linux 日志輪轉(zhuǎn)機制 logrotate 詳解(超詳細版)
日志是排查故障的利劍,但是日志文件不斷增長,如果不及時管理,不僅占用大量磁盤空間,還可能導致系統(tǒng)異常甚至宕機。
本篇系統(tǒng)講解 Linux 下最常用的日志輪轉(zhuǎn)工具——logrotate。
一、什么是日志輪轉(zhuǎn)?
日志輪轉(zhuǎn),簡單來說,就是:
定期對日志文件進行歸檔、壓縮、備份,防止日志無限增長,占滿服務(wù)器磁盤。
日志輪轉(zhuǎn)通常包含以下操作:
- 將舊日志文件重命名歸檔(比如加上時間戳)
- 壓縮歷史日志以節(jié)省空間
- 限制保留日志數(shù)量,超期日志自動刪除
- 可在輪轉(zhuǎn)后執(zhí)行命令,如通知程序重新生成日志
為什么需要日志輪轉(zhuǎn)?
- 避免磁盤空間爆滿
- 加快日志檢索速度
- 便于歸檔和審計
一句話總結(jié):日志輪轉(zhuǎn),是服務(wù)器自我保護的一種能力。
二、什么是 logrotate?
logrotate 是 Linux/Unix 系統(tǒng)中專門用于管理日志輪轉(zhuǎn)的工具。
它具有以下特點:
- 支持定時自動輪轉(zhuǎn)
- 可針對不同日志文件制定不同策略
- 支持壓縮、刪除、郵件發(fā)送等操作
- 可結(jié)合自定義腳本執(zhí)行復(fù)雜操作
大部分 Linux 發(fā)行版(如 CentOS、Ubuntu、Rocky Linux)都預(yù)裝了 logrotate。系統(tǒng)日志、Nginx、MySQL、Tomcat 等日志輪轉(zhuǎn)大多基于它實現(xiàn)。
三、logrotate 安裝與基本使用
檢查是否安裝:在終端執(zhí)行
logrotate --version
如果未安裝,根據(jù)你的系統(tǒng)安裝:
- RHEL / CentOS / Rocky Linux:
dnf install -y logrotate
- Ubuntu / Debian:
sudo apt install -y logrotate
四、logrotate 配置文件詳解
logrotate 配置非常靈活,分為兩類:
1. 全局配置文件
/etc/logrotate.conf文件設(shè)置服務(wù)器的統(tǒng)一默認規(guī)則,適用于大多數(shù)普通日志。
推薦的全局配置:
# 全局輪轉(zhuǎn)周期
weekly # 每周輪轉(zhuǎn)一次
rotate 4 # 保留最近4次的歸檔
create # 每次輪轉(zhuǎn)后新建日志
compress # 歸檔文件 gzip 壓縮
delaycompress # 延遲一輪再壓縮
missingok # 日志丟失不報錯
notifempty # 日志為空不輪轉(zhuǎn)
dateext # 使用日期作為后綴,如 .log-20250426.gz
# 包含單獨服務(wù)配置
include /etc/logrotate.d
2. 子配置文件
子配置文件/etc/logrotate.d/*針對每個應(yīng)用(如 nginx、mysql、docker)單獨定制。
Nginx配置示例:/etc/logrotate.d/nginx:
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 nginx adm
sharedscripts
postrotate
[ -s /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid)
endscript
}
MySQL配置示例:
/var/log/mysql/*.log {
weekly
rotate 8
missingok
compress
notifempty
create 640 mysql mysql
sharedscripts
postrotate
/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf flush-logs
endscript
}
配置參數(shù)詳解:
指令 | 說明 |
/ | 每天/每周/每月輪轉(zhuǎn) |
| 保留 N 個輪轉(zhuǎn)文件 |
| 使用 gzip 壓縮 |
| 延遲到下次輪轉(zhuǎn)才壓縮 |
| 如果日志不存在,不報錯 |
| 如果日志為空,不輪轉(zhuǎn) |
| 創(chuàng)建新日志文件并設(shè)置權(quán)限 |
| 輪轉(zhuǎn)完成后執(zhí)行腳本,如重載服務(wù) |
【注意】子配置文件默認會繼承全局配置,但可以覆蓋!
五、logrotate 工作原理
logrotate 通過定時任務(wù)(cron)每天自動執(zhí)行,流程如下:
(1) 定時觸發(fā):由 /etc/cron.daily/logrotate 腳本調(diào)度
(2) 加載配置:讀取 /etc/logrotate.conf 和 /etc/logrotate.d/*
(3) 檢查日志文件:
- 是否滿足輪轉(zhuǎn)條件(時間、大?。?/li>
- 文件是否存在、是否為空
(4) 執(zhí)行輪轉(zhuǎn)動作:
- 重命名舊日志(加時間后綴)
- 壓縮歸檔
- 創(chuàng)建新的日志文件
- 刪除超期的舊日志
(5) 執(zhí)行鉤子腳本(postrotate)
如果一切正常,輪轉(zhuǎn)過程對應(yīng)用程序是透明的。
六、手動測試與故障排查
有時候需要手動測試 logrotate 是否配置正確,方法如下:
1. 手動測試單個配置文件
sudo logrotate -f /etc/logrotate.d/nginx
2. 帶詳細日志模式
sudo logrotate -vf /etc/logrotate.d/nginx
- -f 強制輪轉(zhuǎn)
- -v 顯示詳細執(zhí)行過程
常見錯誤排查:
- 配置路徑錯誤
- 權(quán)限不足,無法新建日志文件
- postrotate腳本出錯,導致服務(wù)無法重新打開日志
查看系統(tǒng)日志 /var/log/messages 可以幫助進一步排查。