什么是 logrotate? logrotate有什么作用?

在 Linux 系统运维中,日志文件是排查问题、监控系统运行状态的重要工具。然而,如果不加以管理,日志文件会迅速增长,占用大量磁盘空间,甚至导致系统崩溃。本期我们来认识一下 Linux 系统自带的日志管理工具——logrotate,它能自动化地完成日志切割、压缩和清理工作。
什么是 logrotate?
logrotate 是 Linux 系统下一个非常实用的日志管理工具,它主要用于切割日志文件、删除旧的日志文件,并创建新的日志文件,以节省磁盘空间。它可以按照时间(每小时、每天、每周、每月)或文件大小来切割日志,并支持压缩、删除和邮件发送等功能。
为什么需要 logrotate?
如果你的 Web 服务器每天有成千上万的访问量,每次访问都会记录日志,很快日志文件就会变得难以管理。不进行日志轮转会导致:
- • 磁盘空间耗尽:日志文件无限制增长,最终占满整个磁盘
- • 性能下降:超大的日志文件会导致查询和访问速度变慢
- • 错过关键信息:海量日志中很难找到关键的错误信息
logrotate 通常作为日常 cron 作业运行,在后台默默工作,确保你的系统日志始终处于可控状态。
logrotate 的工作原理
logrotate 采用两种主要方式来处理日志文件:
方式一: mv+create(默认方式)
重命名正在输出日志文件,因为重命名只修改目录以及文件的名称,而进程操作文件使用的是 inode,所以并不影响原程序继续输出日志。然后创建新的日志文件,最后通知应用程序重新打开日志文件。这种方式适用于支持重新打开日志文件的应用,如 Nginx、MySQL、syslog 等。
方式二: copytruncate
copytruncate 用于备份和截断当前仍在打开的日志文件;这是一种先复制再清空的方式,在复制和清空之间存在时间间隙,可能会丢失一些日志数据。这种方式适用于不支持重新打开日志文件的应用程序。
配置文件结构
Linux系统默认安装logrotate工具,它默认的配置文件在:/etc/logrotate.conf(主配置文件)和/etc/logrotate.d/(配置目录)。
- • /etc/logrotate.conf: 全局默认配置
- • /etc/logrotate.d/: 各个应用程序的专用配置目录
- • /var/lib/logrotate.status: 记录上次日志轮转的状态信息
大多数应用程序在安装时会自动在/etc/logrotate.d/目录下创建自己的配置文件,如Apache、MySQL、Nginx等。
核心配置指令详解
让我们通过一个实际的配置示例来了解常用指令:
/var/log/myapp/*.log { daily # 每天轮转一次 rotate 7 # 保留7个归档文件 compress # 压缩旧日志 delaycompress # 延迟压缩,最新的归档不压缩 missingok # 如果日志文件丢失,不报错 notifempty # 日志文件为空时不进行轮转 create 0640 root root # 创建新日志文件的权限和所有者 sharedscripts # 多个日志文件只执行一次脚本 postrotate # 轮转后执行的脚本 systemctl reload myapp endscript}时间周期相关
- • daily: 每天轮转
- • weekly: 每周轮转
- • monthly: 每月轮转
- • yearly: 每年轮转
大小相关
- • size 100M: 日志文件达到 100MB 时轮转
- • minsize 50M: 满足时间条件且文件大小至少 50MB 时才轮转
- • maxsize 200M: 文件达到 200MB 立即轮转,即使未到时间
保留和压缩
- • rotate 5: 保留 5 个归档文件,第 6 个会被删除
- • compress: 使用 gzip 压缩旧日志
- • nocompress: 不压缩
- • delaycompress: 不压缩最新的归档,下次轮转时再压缩
- • compresscmd gzip: 指定压缩命令
- • compressext .gz: 指定压缩文件扩展名
文件处理
- • create 0644 user group: 创建新日志文件并设置权限和所有者
- • copytruncate: 复制后清空原文件,而不是移动
- • dateext: 使用日期作为归档后缀(如.log-20250101)
- • dateformat -%Y%m%d: 自定义日期格式
- • missingok: 日志文件不存在时不报错
- • notifempty: 空日志文件不轮转
脚本钩子
- • prerotate/endscript: 轮转前执行的脚本
- • postrotate/endscript: 轮转后执行的脚本
- • sharedscripts: 对所有日志只执行一次脚本,而不是每个文件都执行
实战案例
案例 1: 为自定义应用配置日志轮转
假设你开发了一个应用,日志文件位于/var/log/myapp/app.log,我们来创建配置:
# 创建配置文件sudo vim /etc/logrotate.d/myapp# 添加以下内容/var/log/myapp/app.log { daily rotate 30 compress delaycompress missingok notifempty create 0640 myuser mygroup postrotate # 通知应用重新打开日志文件 kill -USR1 $(cat /var/run/myapp.pid) endscript}案例 2: Nginx 日志轮转(典型配置)
/var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 nginx nginx sharedscripts postrotate # 重新打开日志文件 [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid) endscript}案例 3: 基于大小的轮转
对于流量不稳定的应用,按大小轮转更合理:
/var/log/app/access.log { size 100M rotate 10 compress missingok notifempty create 0640 www-data www-data copytruncate}常用命令操作
测试配置
使用 -d 选项以预演方式运行 logrotate,不会实际轮循日志文件,可以模拟演练日志轮循并显示其输出:
# 测试配置是否正确(调试模式)sudo logrotate -d /etc/logrotate.conf# 测试单个配置文件sudo logrotate -d /etc/logrotate.d/nginx手动执行轮转
# 强制执行轮转(即使条件未满足)sudo logrotate -f /etc/logrotate.conf# 强制轮转特定配置sudo logrotate -f /etc/logrotate.d/nginx# 详细模式,显示执行过程sudo logrotate -v /etc/logrotate.conf查看轮转状态
# 查看上次轮转记录cat /var/lib/logrotate.status使用自定义状态文件
# 指定状态文件位置sudo logrotate -s /tmp/logrotate.status /etc/logrotate.conf调整轮转时间
由于 logrotate 是基于 cron 运行的,日志轮转的时间是由 cron 控制的,具体可以查询cron的配置文件/etc/anacrontab。只有当 logrotate 被执行时,它才会去检查:
- • 是否到时间(daily/weekly/monthly)
- • 是否超过 size
- • 是否满足 minsize / maxsize 等条件
所以:
如果系统每天只跑一次 logrotate,日志即使中午就超过 100MB,也要等到下一次 logrotate 运行时才会切。
默认情况下,logrotate 每天凌晨 3 点到 22 点之间的某个时间运行。如果需要在特定时间执行,可以:
# 查看当前cron配置cat /etc/cron.daily/logrotate# 如果需要在每天午夜执行,可以创建自定义cron任务# 编辑crontabsudo crontab -e# 添加以下行(每天0点执行)0 0 * * * /usr/sbin/logrotate /etc/logrotate.conf如果需要更频繁的轮转(如每小时):
# 将logrotate脚本移到hourly目录sudo mv /etc/cron.daily/logrotate /etc/cron.hourly/常见问题与解决方案
问题 1: 日志没有自动轮转
排查步骤:
- 1. 检查 cron 服务是否运行:systemctl status cron
- 2. 查看 logrotate 状态文件:cat /var/lib/logrotate.status
- 3. 手动测试配置:sudo logrotate -d /etc/logrotate.d/your-app
- 4. 查看系统日志:grep logrotate /var/log/syslog
问题 2: 应用程序仍向旧日志文件写入
这通常是因为应用没有重新打开日志文件。解决方法:
- • 使用copytruncate选项
- • 在postrotate脚本中正确通知应用程序重载
- • 确认应用程序支持信号重载(如 USR1)
问题 3: 权限问题
确保 logrotate 有权限访问日志文件和目录:
# 检查文件权限ls -la /var/log/myapp/# 如果需要,调整权限sudo chown -R user:group /var/log/myapp/最佳实践建议
- 1. 合理设置保留期限: 根据磁盘空间和法规要求设置rotate数量
- 2. 启用压缩: 使用compress和delaycompress节省空间
- 3. 测试再上线: 使用-d参数先测试配置
- 4. 监控磁盘空间: 定期检查/var/log目录大小
- 5. 备份重要日志: 对于关键系统,考虑将日志归档到远程存储
- 6. 文档化配置: 在配置文件中添加注释说明
- 7. 使用通配符谨慎: 避免使用*匹配所有文件,这可能会轮转已归档的文件
安全注意事项
- 1. 保护配置文件:
sudo chmod 644 /etc/logrotate.confsudo chmod 644 /etc/logrotate.d/*- 2. 限制状态文件访问:
sudo chown root:root /var/lib/logrotate.statussudo chmod 600 /var/lib/logrotate.status- 3. 审计日志轮转: 定期检查轮转是否正常执行
写在最后
logrotate 是 Linux 系统管理员的必备工具,它能够自动化日志管理,防止磁盘空间被耗尽,保持系统稳定运行。通过合理配置,可以达到如下目标:
- • 自动切割和归档日志文件
- • 压缩旧日志节省空间
- • 清理过期日志释放磁盘
- • 在轮转前后执行自定义操作
掌握 logrotate 的使用,不仅能让你的日志管理更加高效,还能在故障排查时快速定位问题。建议在生产环境中先进行充分测试,确保配置符合实际需求。
本文内容仅供参考,不构成任何专业建议。使用本文提供的信息时,请自行判断并承担相应风险。



