我始终相信,一名合格的Linux运维,必定在工作上极度依赖查看日志解决各种问题。毕竟日志是Linux服务器的故障诊断书,系统运行状态、应用报错详情全靠它追溯。但不管系统日志还是应用日志,它们的体积就像滚雪球,会持续不断地增大,给运维工作埋下巨大隐患!身边认识的好多大佬都经历过因为日志打满系统盘导致p0级故障的。关于日志管理工具,常见的有这些:newsyslog、savelog、logadm等等。当然,我解决问题是非常热衷于只用Linux系统自带工具,包括这个日志管理王牌工具——logrotate,之前在一篇文章中简单提起过:Linux 运维实战:多维度预防日志打满磁盘全攻略,但不少人私信说文章说的不够细,这次计划从原理到实操,一步一步实现日志自动归档、压缩、清理,让日志管理效率翻倍,服务器稳定性直线飙升(但凡有几粒花生米,也不至于这么吹!)日志轮转核心目标就是防止日志无限增长,精准解决运维中的3大痛点:- 告别磁盘爆满:自动清理超期无用日志,不让冗余数据占用关键磁盘空间;
- 检索效率翻倍:拆分后的日志体积更小,查询特定时间段日志时速度大幅提升;
- 合规审计无忧:按时间戳归档的日志,直接满足企业合规审计和问题回溯需求。
简单来说,日志轮转就像给日志“定期瘦身+专业存档”,是服务器自我保护的核心能力,更是Linux运维工程师的必备基础技能之一。二、logrotate:Linux默认的日志管理王者logrotate是Linux/Unix系统默认预装的日志轮转工具(几乎所有主流发行版均自带),能成为运维标配,全靠这些硬核优势:- 触发机制灵活:支持按天/周/月定时轮转,也能按日志大小(如100M)触发;
- 应用适配广泛:可给Nginx、MySQL、Tomcat等单个应用定制独立轮转规则;
- 功能实用全面:内置压缩、删除、邮件发送等功能,满足多样化日志管理需求;
- 扩展能力强大:支持执行自定义脚本,实现服务重载等复杂操作。
无论是系统日志(/var/log/),还是各类应用日志,其轮转管理大多依赖logrotate实现,是运维工作中不可或缺的日志管家。# 验证是否已安装logrotate --version
我这里的截图可以看出,当前安装的logrotate版本是3.21.0,同时列出了它默认的压缩、邮件等命令路径,以及支持AC和SELinux安全机制的信息。logrotate的配置分为“全局配置”和“子配置”,全局定义默认规则,子配置针对单个应用定制(优先级更高,可覆盖全局),分开细说:1. 全局配置文件:/etc/logrotate.conf全局配置定义服务器级默认策略,适用于大多数普通日志,推荐配置:# 轮转周期:可选weekly(每周)/daily(每天)/monthly(每月)weekly# 保留最近4个归档文件,超期自动删除最早的rotate 4# 轮转后自动创建新的日志文件,保证应用正常写入create# 归档日志用gzip压缩,大幅节省磁盘空间compress# 延迟压缩:当前轮转的日志不压缩,下次轮转时再压缩(避免影响应用读写)delaycompress# 日志文件不存在时不报错,防止误报干扰missingok# 日志为空时不执行轮转,避免无效操作notifempty# 归档文件添加日期戳(如access.log-20250426.gz),方便识别时间dateext# 加载应用级子配置(关键!让每个应用可定制规则)include /etc/logrotate.d
2. 子配置文件:/etc/logrotate.d/每个应用的独立轮转规则都放在/etc/logrotate.d/目录下,建议文件名与应用名保持一致(如nginx、mysql):粟子1:rsyslog日志轮转(/etc/logrotate.d/rsyslog)顶部路径:指定要管理的日志文件,包括系统日志(syslog)、邮件日志(mail.log)、内核日志(kern.log)等。- rotate 7:保留最近 7 份轮转后的日志文件。
- notifempty:如果日志文件为空,不进行轮转。
- size 50M:日志文件大小超过 50MB 时也会触发轮转(和 daily 满足其一即执行)。
- compress:轮转后的日志文件用 gzip 压缩。
- delaycompress:延迟压缩,直到下一次轮转时再压缩当前日志。
- sharedscripts:所有日志轮转完成后,只执行一次脚本。
- postrotate... endscript:轮转完成后,执行 /usr/lib/rsyslog/rsyslog-rotate 脚本,用来重启 rsyslog 服务,让它重新打开日志文件。
粟子2:我这实验环境没有MySQL,但查找了相关资料,可以按这个日志轮转才设置MySQL(/etc/logrotate.d/mysql),它也不会重启 MySQL 服务,也不会中断数据库的正常运行,不然你会被打屎的:# 匹配MySQL所有日志文件路径/var/log/mysql/*.log { weekly # 每周轮转 rotate 8 # 保留8周(约2个月)归档文件 missingok # 日志不存在不报错 compress # 压缩归档日志 notifempty # 空日志不轮转 create 640 mysql mysql # 新建日志文件,权限640,所有者mysql:mysql sharedscripts # 统一执行脚本 postrotate # 轮转后刷新MySQL日志,避免写入异常 /usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf flush-logs endscript}
整个过程无需人工干预,完全不影响服务正常运行,真正实现日志管理自动化~六、手动测试+故障排查,这才是一名合格的Linux运维必备的技能:# 强制执行mysql日志轮转(-f:强制触发)logrotate -f /etc/logrotate.d/mysql
# -v:显示执行过程,-f:强制轮转,清晰查看每一步操作logrotate -vf /etc/logrotate.d/mysql
路径错误:检查日志路径、应用PID路径是否正确(如Nginx的pid是否在/run/nginx.pid);权限不足:新日志文件的权限需与应用运行用户匹配(如Nginx用nginx用户,新日志所有者需设为nginx);脚本报错:手动执行postrotate中的命令,排查是否因PID不存在、命令错误导致执行失败;查看系统日志:通过grep logrotate /var/log/messages(CentOS)或grep logrotate /var/log/syslog(Ubuntu)获取logrotate执行日志,定位问题根源。logrotate作为Linux系统自带的日志管理神器,通过简单的配置就能实现日志的自动化轮转、压缩、清理,从根本上解决日志无限增长的痛点。无论是单机服务器还是集群环境,合理使用logrotate都能让日志管理更高效,减少磁盘被打满的风险,让服务器更稳定运行。这个神器,你细想一下,就会知道,它本质是一个通用的文件管理工具,并不局限于日志文件,用它来管理图片、文档等其他类型的文件也完全可行,对指定的目录内的文件做出一系列自动的动作。基于这个思维,其实可以做好多事情的,比如指定某个目录的照片自动打包多少天之前的,删除多少天之前的。玩法还是很多的。最后当然是例牌:欢迎各位大佬留言分享更多Linux运维实用技巧!