使用 logrotate 命令轮转和归档日志
  

暴躁的钢索 12941人觉得有帮助

{{ttag.title}}
日志非常适合找出应用程序在做什么或对可能的问题进行故障排除。几乎我们处理的每个应用程序都会生成日志,我们希望我们自己开发的应用程序也生成日志。日志越详细,我们拥有的信息就越多。但放任不管,日志可能会增长到无法管理的大小,反过来,它们可能会成为它们自己的问题。因此,最好将它们进行裁剪,保留我们需要的那些,并将其余的归档。
基本功能
logrotate 实用程序在管理日志方面非常出色。它可以轮转日志、压缩日志、通过电子邮件发送日志、删除日志、归档日志,并在你需要时开始记录最新的。
运行 logrotate 非常简单——只需要运行 logrotate -vs state-file config-file。在上面的命令中,v 选项开启详细模式,s 指定一个状态文件,最后的 config-file 是配置文件,你可以指定需要做什么。
实战演练
让我们看看在我们的系统上静默运行的 logrotate 配置,它管理我们在 /var/log 目录中找到的大量日志。查看该目录中的当前文件。你是否看到很多 *.[number].gz 文件?这就是 logrotate 正在做的。你可以在 /etc/logrotate.d/rsyslog 下找到此配置文件。我的配置文件如下:
  • /var/log/syslog
  • {
  •         rotate 7
  •         daily
  •         missingok
  •         notifempty
  •         delaycompress
  •         compress
  •         postrotate
  •                 reload rsyslog > /dev/null 2>&1 || true
  •         endscript
  • }
  • /var/log/mail.info
  • /var/log/mail.warn
  • /var/log/mail.err
  • /var/log/mail.log
  • /var/log/daemon.log
  • /var/log/kern.log
  • /var/log/auth.log
  • /var/log/user.log
  • /var/log/lpr.log
  • /var/log/cron.log
  • /var/log/debug
  • /var/log/messages
  • {
  •         rotate 4
  •         weekly
  •         missingok
  •         notifempty
  •         compress
  •         delaycompress
  •         sharedscripts
  •         postrotate
  •                 reload rsyslog > /dev/null 2>&1 || true
  •         endscript
  • }

该文件首先定义了轮转 /var/log/syslog 文件的说明,这些说明包含在后面的花括号中。以下是它们的含义:
  • rotate 7: 保留最近 7 次轮转的日志。然后开始删除超出的。
  • daily: 每天轮转日志,与 rotate 7 一起使用,这意味着日志将保留过去 7 天。其它选项是每周、每月、每年。还有一个大小参数,如果日志文件的大小增加超过指定的限制(例如,大小 10k、大小 10M、大小 10G 等),则将轮转日志文件。如果未指定任何内容,日志将在运行 logrotate 时轮转。你甚至可以在 cron 中运行 logrotate 以便在更具体的时间间隔内使用它。
  • missingok: 如果日志文件缺失也没关系。不要惊慌。
  • notifempty: 日志文件为空时不轮转。
  • compress: 开启压缩,使用 nocompress 关闭它。
  • delaycompress: 如果压缩已打开,则将压缩延迟到下一次轮转。这允许至少存在一个轮转但未压缩的文件。如果你希望昨天的日志保持未压缩以便进行故障排除,那么此配置会很有用。如果某些程序在重新启动/重新加载之前可能仍然写入旧文件,这也很有帮助,例如 Apache。
  • postrotate/endscript: 轮转后运行此部分中的脚本。有助于做清理工作。还有一个 prerotate/endscript 用于在轮转开始之前执行操作。

你能弄清楚下一节对上面配置中提到的所有文件做了什么吗?第二节中唯一多出的参数是 sharedscripts,它告诉 logrotate 在所有日志轮转完成之前不要运行 postrotate/endscript 中的部分。它可以防止脚本在每一次轮转时执行,只在最后一次轮转完成时执行。
看点新的东西
我使用下面的配置来处理我系统上的 Nginx 的访问和错误日志。
  • /var/log/nginx/access.log
  • /var/log/nginx/error.log  {
  •         size 1
  •         missingok
  •         notifempty
  •         create 544 www-data adm
  •         rotate 30
  •         compress
  •         delaycompress
  •         dateext
  •         dateformat -%Y-%m-%d-%s
  •         sharedscripts
  •         extension .log
  •         postrotate
  •                 service nginx reload
  •         endscript
  • }

上面的脚本可以使用如下命令运行:
  • logrotate -vs state-file /tmp/logrotate

第一次运行该命令会给出以下输出:
  • reading config file /tmp/logrotate
  • extension is now .log
  • Handling 1 logs
  • rotating pattern: /var/log/nginx/access.log
  • /var/log/nginx/error.log   1 bytes (30 rotations)
  • empty log files are not rotated, old logs are removed
  • considering log /var/log/nginx/access.log
  •   log needs rotating
  • considering log /var/log/nginx/error.log
  •   log does not need rotating
  • rotating log /var/log/nginx/access.log, log->rotateCount is 30
  • Converted ' -%Y-%m-%d-%s' -> '-%Y-%m-%d-%s'
  • dateext suffix '-2021-08-27-1485508250'
  • glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
  • glob finding logs to compress failed
  • glob finding old rotated logs failed
  • renaming /var/log/nginx/access.log to /var/log/nginx/access-2021-08-27-1485508250.log
  • creating new /var/log/nginx/access.log mode = 0544 uid = 33 gid = 4
  • running postrotate script
  • * Reloading nginx configuration nginx

第二次运行它:
  • reading config file /tmp/logrotate
  • extension is now .log
  • Handling 1 logs
  • rotating pattern: /var/log/nginx/access.log
  • /var/log/nginx/error.log   1 bytes (30 rotations)
  • empty log files are not rotated, old logs are removed
  • considering log /var/log/nginx/access.log
  •   log needs rotating
  • considering log /var/log/nginx/error.log
  •   log does not need rotating
  • rotating log /var/log/nginx/access.log, log->rotateCount is 30
  • Converted ' -%Y-%m-%d-%s' -> '-%Y-%m-%d-%s'
  • dateext suffix '-2021-08-27-1485508280'
  • glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
  • compressing log with: /bin/gzip
  • renaming /var/log/nginx/access.log to /var/log/nginx/access-2021-08-27-1485508280.log
  • creating new /var/log/nginx/access.log mode = 0544 uid = 33 gid = 4
  • running postrotate script
  • * Reloading nginx configuration nginx

第三次运行它:
  • reading config file /tmp/logrotate
  • extension is now .log
  • Handling 1 logs
  • rotating pattern: /var/log/nginx/access.log
  • /var/log/nginx/error.log   1 bytes (30 rotations)
  • empty log files are not rotated, old logs are removed
  • considering log /var/log/nginx/access.log
  •   log needs rotating
  • considering log /var/log/nginx/error.log
  •   log does not need rotating
  • rotating log /var/log/nginx/access.log, log->rotateCount is 30
  • Converted ' -%Y-%m-%d-%s' -> '-%Y-%m-%d-%s'
  • dateext suffix '-2021-08-27-1485508316'
  • glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
  • compressing log with: /bin/gzip
  • renaming /var/log/nginx/access.log to /var/log/nginx/access-2021-08-27-1485508316.log
  • creating new /var/log/nginx/access.log mode = 0544 uid = 33 gid = 4
  • running postrotate script
  • * Reloading nginx configuration nginx

状态文件的内容如下所示:
  • logrotate state -- version 2
  • "/var/log/nginx/error.log" 2021-08-27-9:0:0
  • "/var/log/nginx/access.log" 2021-08-27-9:11:56

打赏鼓励作者,期待更多好文!

打赏
暂无人打赏

临兵斗者 发表于 2022-12-23 10:16
  
楼主分析的很详细,不错的实战经验,
一个无趣的人 发表于 2022-12-23 13:36
  
楼主的文章图文并茂,清晰易懂,看完这波操作可以轻松上手了,如遇到问题再向楼主请教~
发表新帖
热门标签
全部标签>
每日一问
技术盲盒
技术笔记
干货满满
技术咨询
产品连连看
新版本体验
功能体验
标准化排查
GIF动图学习
自助服务平台操作指引
通用技术
2023技术争霸赛专题
运维工具
信服课堂视频
秒懂零信任
技术晨报
用户认证
答题自测
深信服技术支持平台
安装部署配置
SDP百科
设备维护
社区帮助指南
每日一记
项目案例
玩转零信任
畅聊IT
专家问答
技术圆桌
在线直播
MVP
网络基础知识
升级
安全攻防
上网策略
测试报告
日志审计
问题分析处理
流量管理
云计算知识
原创分享
解决方案
sangfor周刊
VPN 对接
SANGFOR资讯
专家分享
技术顾问
信服故事
功能咨询
终端接入
授权
资源访问
地址转换
虚拟机
存储
迁移
加速技术
排障笔记本
产品预警公告
信服圈儿
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
答题榜单公布
纪元平台
卧龙计划
华北区拉练
天逸直播
以战代练
山东区技术晨报
文档捉虫活动
齐鲁TV
华北区交付直播
每周精选

本版版主

217
274
151

发帖

粉丝

关注

本版达人

皮皮虾·真

本周建议达人

郑州网络

本周分享达人

二进制网络

本周提问达人