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