文章目录
- CentOS 7 日志切割实战:Logrotate 详解与配置指南
- Logrotate 简介
- 安装与配置文件
- 确认安装
- 配置文件结构
- 核心配置参数详解
- 实战配置案例
- 案例1:Nginx 日志切割
- 案例2:按大小切割应用日志
- 案例3:Java 程序日志 `test.log` 切割配置
- 创建 Logrotate 配置文件
- 添加配置内容
- 配置说明
- 手动测试配置
- 验证日志切割结果
- 定时任务
- 手动测试与调试
- 手动执行轮换
- 调试配置问题
- 常见问题排查
- 日志未按预期切割
- 切割后服务日志不更新
- 总结
CentOS 7 日志切割实战:Logrotate 详解与配置指南
日志管理是服务器运维中不可或缺的一环,而 Logrotate 作为 Linux 系统自带的日志轮换工具,能够高效自动化地处理日志文件的切割、压缩、删除等操作。本文将深入解析 CentOS 7 中 Logrotate 的配置技巧与实战应用。
Logrotate 简介
Logrotate 通过预设规则自动对日志文件进行轮换(Rotate),避免单个日志文件过大导致磁盘空间不足或影响读写性能。其核心功能包括:
- 切割日志:按时间或大小拆分日志文件。
- 压缩存储:减少历史日志的磁盘占用。
- 自动清理:保留指定数量的旧日志,防止堆积。
安装与配置文件
确认安装
CentOS 7 默认已集成 Logrotate,可通过以下命令验证:
rpm -qa | grep logrotate
# 若未安装,执行:yum install logrotate -y
配置文件结构
- 主配置文件:
/etc/logrotate.conf
定义全局配置(如压缩格式、轮换周期等)。 - 自定义配置目录:
/etc/logrotate.d/
存放各服务的独立配置文件(如 Nginx、Apache 等)。
核心配置参数详解
以下为常用配置选项(以 /etc/logrotate.d/nginx
为例):
/var/log/nginx/*.log {
daily # 按天切割
missingok # 日志不存在时不报错
rotate 30 # 保留30份旧日志
compress # 启用压缩(默认gzip)
delaycompress # 延迟压缩最新一份日志
notifempty # 空日志不轮换
sharedscripts # 所有日志处理完再执行脚本
postrotate # 切割后执行的命令
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
dateext # 使用日期作为后缀格式
dateformat -%Y%m%d # 自定义日期格式(示例:.log-20231001)
}
关键参数说明:
- 切割周期:
daily
、weekly
、monthly
或size
(如size 100M
) - 保留数量:
rotate X
指定保留旧日志的数量。 - 压缩控制:
compress
立即压缩;delaycompress
延迟压缩上一个轮换文件。 - 脚本钩子:
prerotate
/postrotate
在切割前后执行命令(如重启服务)。
实战配置案例
案例1:Nginx 日志切割
# /etc/logrotate.d/nginx
/var/log/nginx/access.log
/var/log/nginx/error.log {
daily
rotate 7
missingok
compress
delaycompress
notifempty
dateext
sharedscripts
postrotate
# 向Nginx主进程发送USR1信号重新打开日志文件
if [ -f /run/nginx.pid ]; then
kill -USR1 `cat /run/nginx.pid`
fi
endscript
}
案例2:按大小切割应用日志
# /etc/logrotate.d/myapp
/opt/myapp/logs/*.log {
size 200M # 超过200MB时触发切割
rotate 5 # 保留5个归档
compress
notifempty
copytruncate # 复制原日志后截断,避免重启服务
}
案例3:Java 程序日志 test.log
切割配置
假设你的 Java 程序生成的日志文件路径为 /opt/myapp/logs/test.log
,我们希望每天切割一次日志,保留最近 7 天的日志,并对旧日志进行压缩。
创建 Logrotate 配置文件
在 /etc/logrotate.d/
目录下创建一个新的配置文件,例如 myapp
:
sudo vi /etc/logrotate.d/myapp
添加配置内容
将以下内容添加到配置文件中:
/opt/myapp/logs/test.log {
daily # 每天切割一次
missingok # 如果日志文件不存在,不报错
rotate 7 # 保留7份旧日志
compress # 压缩旧日志
delaycompress # 延迟压缩最新一份日志
notifempty # 如果日志为空,不进行切割
copytruncate # 复制日志后截断原文件,避免重启Java程序
dateext # 使用日期作为日志文件后缀
dateformat -%Y%m%d # 自定义日期格式(示例:test.log-20231001)
}
配置说明
daily
:每天切割一次日志。missingok
:如果日志文件不存在,Logrotate 不会报错。rotate 7
:保留最近 7 天的日志文件,超过的会被删除。compress
:使用 gzip 压缩旧日志文件。delaycompress
:延迟压缩最新一份日志文件,方便查看。notifempty
:如果日志文件为空,则不进行切割。copytruncate
:复制日志文件后截断原文件,适用于不支持重启的 Java 程序。dateext
:在日志文件名后添加日期后缀。dateformat
:自定义日期格式(例如test.log-20231001
)。
手动测试配置
在正式使用前,可以通过以下命令手动测试配置是否正确:
sudo logrotate -vf /etc/logrotate.d/myapp
-v
:显示详细信息。-f
:强制立即执行切割。
如果配置正确,你会看到类似以下的输出:
reading config file /etc/logrotate.d/myapp
Handling 1 logs
rotating pattern: /opt/myapp/logs/test.log after 1 days (7 rotations)
empty log files are not rotated, old logs are removed
considering log /opt/myapp/logs/test.log
log needs rotating
rotating log /opt/myapp/logs/test.log, log->rotateCount is 7
dateext suffix '-20231001'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
copying /opt/myapp/logs/test.log to /opt/myapp/logs/test.log-20231001
truncating /opt/myapp/logs/test.log
compressing log with: /bin/gzip
验证日志切割结果
执行完 Logrotate 后,检查日志目录 /opt/myapp/logs/
,应该会看到类似以下文件:
test.log
:当前日志文件(已被截断)。test.log-20231001.gz
:切割并压缩的旧日志文件。
定时任务
Logrotate 默认通过 cron
每天执行一次。你可以查看 /etc/cron.daily/logrotate
文件确认:
cat /etc/cron.daily/logrotate
如果需要调整执行频率,可以修改 /etc/cron.daily/logrotate
或创建自定义 cron 任务。
手动测试与调试
手动执行轮换
# -v 显示详细信息,-f 强制立即执行
logrotate -vf /etc/logrotate.d/nginx
调试配置问题
- 查看执行记录:
grep logrotate /var/lib/logrotate/logrotate.status
- 模拟运行(Dry Run):
logrotate -d /etc/logrotate.d/nginx
常见问题排查
日志未按预期切割
- 检查 cron 任务:Logrotate 由
/etc/cron.daily/logrotate
定时调用,确认 cron 服务运行正常。 - 验证配置文件语法:确保无语法错误,路径正确。
- 文件权限问题:确保日志目录对 Logrotate 进程可写。
切割后服务日志不更新
- 使用
copytruncate
替代postrotate
:某些应用需复制后截断原文件,避免依赖信号重启。 - 确认
postrotate
脚本正确性:如 Nginx 需发送USR1
信号而非重启。
总结
Logrotate 通过灵活的配置策略,极大地简化了日志管理的工作量。合理设置切割规则、压缩策略和钩子脚本,既能保障日志可追溯性,又能有效节省磁盘空间。建议结合业务需求定期审查日志配置,确保其高效稳定运行。