当前位置:首页>Linux>linux自带的服务器日志清理工具,太赞了

linux自带的服务器日志清理工具,太赞了

  • 2026-09-02 19:42:08
linux自带的服务器日志清理工具,太赞了

logrotate 是 Linux 系统中用于自动管理日志文件的工具。它可以按照指定的规则(如每天、每周、或文件大小)对日志文件进行轮转(重命名旧日志)、压缩、删除(保留指定份数),甚至可以在轮转后执行自定义脚本(如重启服务),从而避免日志文件无限增长耗尽磁盘空间。

为什么需要 logrotate?

  • 系统和服务(如 rsyslog、nginx、httpd)会持续写入日志,时间久了文件会变得巨大,不仅占用磁盘,还会影响性能。

  • 手动清理日志繁琐且容易出错,logrotate 实现了标准化、自动化管理。


logrotate 的工作原理

logrotate 通常由系统的定时任务(cron)每天自动运行一次。  

  • 主程序:/usr/sbin/logrotate

  • 配置文件:/etc/logrotate.conf(全局配置)  

  • 应用配置目录:/etc/logrotate.d/(每个服务可单独放一个配置文件)

当 cron 触发 logrotate 时,它会读取所有配置,对符合条件的日志文件执行轮转操作。


logrotate 的核心配置指令

一个典型的 logrotate 配置由多个“规则块”组成,每个规则块指定要处理的日志文件路径及参数。常用指令如下:

指令说明
daily / weekly / monthly轮转周期(每天/每周/每月)
rotate N保留最近 N 个轮转后的旧日志(超过则删除)
compress对旧日志进行压缩(通常用 gzip)
delaycompress延迟压缩(推迟到下一次轮转时才压缩上一次的旧日志,避免正在写入的日志被压缩)
missingok如果日志文件不存在,忽略错误,继续执行
notifempty如果日志文件为空,则不进行轮转
create [权限] [用户] [组]轮转后创建新的空日志文件,并设置权限和属主
size 大小当日志文件达到指定大小时触发轮转(如 size 100M),可与周期共存
postrotate / endscript在轮转后执行的 shell 命令块(常用于通知服务重新打开日志文件,如 kill -HUP $(cat /var/run/nginx.pid))
sharedscripts对于匹配多个日志的规则,所有日志轮转后只执行一次 postrotate 脚本(默认每个日志执行一次)
dateext在轮转后的文件名末尾加上日期(如 messages-20250317)而非简单的数字序号

配置文件示例

1. 全局配置 /etc/logrotate.conf

# 每周轮转
weekly
# 保留最近 4 个旧日志
rotate 4
# 创建新文件时使用默认权限
create
# 启用压缩
compress
# 包含 /etc/logrotate.d 下的所有配置
include /etc/logrotate.d

2. 针对特定服务的配置(例如 nginx)

在 /etc/logrotate.d/nginx 中:

/var/log/nginx/*.log {
    daily                # 每天轮转
    missingok            # 日志文件不存在也没关系
    rotate 14# 保留 14 天
    compress             # 压缩旧日志
    delaycompress        # 延迟压缩(避免压缩当前正在写入的日志)
    notifempty           # 空文件不轮转
    create 0640 nginx adm # 轮转后新建日志文件,权限 0640,属主 nginx:adm
    sharedscripts        # 所有日志处理完后执行一次 postrotate
    postrotate
if [ -f /var/run/nginx.pid ]; then
kill-USR1`cat /var/run/nginx.pid`# 通知 nginx 重新打开日志文件
fi
    endscript
}

如何使用 logrotate

1. 手动测试配置是否正确

logrotate -d /etc/logrotate.conf

-d(debug)模式会模拟执行,不会实际轮转,只输出将要进行的操作,用于检查配置语法和预期行为。

2. 强制立即执行轮转

logrotate -vf /etc/logrotate.conf
  • -v:显示详细过程  

  • -f:强制执行,即使未到轮转周期也会触发

也可以只强制某个服务的配置:

logrotate -vf /etc/logrotate.d/nginx

3. 查看上次运行时间

logrotate 的状态文件通常位于 /var/lib/logrotate/logrotate.status,记录了每个日志文件上次轮转的时间。


常见问题

Q: 为什么我配置了 daily,但日志没有每天轮转?A: logrotate 依赖 cron 每天执行一次,检查是否满足轮转条件。如果系统时间被更改,或者状态文件记录的时间未到,就不会触发。可以手动用 -f 强制执行测试。

Q: 如何按大小轮转?A: 使用 size 指令,例如 size 100M。注意如果同时指定了周期(如 daily),则满足任一条件就会轮转。

Q: 轮转后服务无法写入新日志?A: 常见原因是 postrotate 脚本没有正确通知服务重新打开文件。确保脚本中使用的是 kill -HUP 或 kill -USR1 等信号,不同服务可能不同(如 rsyslog 用 kill -HUP,nginx 用 kill -USR1)。

Q: 能否压缩后保留更长时间?A: 可以,rotate 指定保留份数,结合 compress 即可。例如 rotate 30 保留 30 个旧日志,如果每天轮转,就是约 30 天的历史。


总结

  • logrotate 是系统自带的日志管理利器,通过简单的配置即可实现自动化轮转、压缩、清理。

  • 配置文件结构清晰,支持灵活的参数组合。

  • 大多数服务(如 rsyslog、httpd、nginx)在安装时就会在 /etc/logrotate.d/ 下生成默认配置,通常无需修改即可工作。

  • 若需调整,直接编辑对应的配置文件,然后可用 logrotate -d 验证,再用 -f 测试效果。

相比于手动编写清理脚本,使用 logrotate 是更标准、更可靠的做法,推荐在生产环境中采用。

最新文章

随机文章