返回文章列表
服务器

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

新颖
2025-12-11
9小时前
什么是 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. 1. 检查 cron 服务是否运行:systemctl status cron
  2. 2. 查看 logrotate 状态文件:cat /var/lib/logrotate.status
  3. 3. 手动测试配置:sudo logrotate -d /etc/logrotate.d/your-app
  4. 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. 1. 合理设置保留期限: 根据磁盘空间和法规要求设置rotate数量
  2. 2. 启用压缩: 使用compress和delaycompress节省空间
  3. 3. 测试再上线: 使用-d参数先测试配置
  4. 4. 监控磁盘空间: 定期检查/var/log目录大小
  5. 5. 备份重要日志: 对于关键系统,考虑将日志归档到远程存储
  6. 6. 文档化配置: 在配置文件中添加注释说明
  7. 7. 使用通配符谨慎: 避免使用*匹配所有文件,这可能会轮转已归档的文件

安全注意事项

  1. 1. 保护配置文件:
sudo chmod 644 /etc/logrotate.confsudo chmod 644 /etc/logrotate.d/*
  1. 2. 限制状态文件访问:
sudo chown root:root /var/lib/logrotate.statussudo chmod 600 /var/lib/logrotate.status
  1. 3. 审计日志轮转: 定期检查轮转是否正常执行

写在最后

logrotate 是 Linux 系统管理员的必备工具,它能够自动化日志管理,防止磁盘空间被耗尽,保持系统稳定运行。通过合理配置,可以达到如下目标:

  • • 自动切割和归档日志文件
  • • 压缩旧日志节省空间
  • • 清理过期日志释放磁盘
  • • 在轮转前后执行自定义操作

掌握 logrotate 的使用,不仅能让你的日志管理更加高效,还能在故障排查时快速定位问题。建议在生产环境中先进行充分测试,确保配置符合实际需求。


本文内容仅供参考,不构成任何专业建议。使用本文提供的信息时,请自行判断并承担相应风险。

分享文章
合作伙伴

本站所有广告均是第三方投放,详情请查询本站用户协议