Linux 日志輪轉(zhuǎn)機(jī)制 logrotate 詳解(超詳細(xì)版)
日志是排查故障的利劍,但是日志文件不斷增長,如果不及時(shí)管理,不僅占用大量磁盤空間,還可能導(dǎo)致系統(tǒng)異常甚至宕機(jī)。
本篇系統(tǒng)講解 Linux 下最常用的日志輪轉(zhuǎn)工具——logrotate。

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























