本文主要讨论以下几个方面:
- logrotate 的关键配置文件和配置项语法;
- logrotate 的使用与运维技巧;
- logrotate 的运行原理;
- 特殊场景下 logrotate 的代替方案;
配置文件与配置语法
logrotate 的配置文件主要是 /etc/logrotate.conf
和 /etc/logrotate.d
目录;
/etc/logrotate.conf 文件作为主配置文件, include 了 /etc/logrotate.d 目录下具体的配置内容;
以下是 /etc/logrotate.conf 的默认内容:
1 | # 默认的历史日志保留周期单位: 周 |
/etc/logrotate.conf 的默认配置优先级比 /etc/logrotate.d/ 目录下的独立配置要低, /etc/logrotate.d 下所有的独立配置文件中的配置项可以覆盖 /etc/logrotate.conf;
以 rsyslog 的配置文件为例, 以下是 /etc/logrotate.d/rsyslog 的内容:
1 | /var/log/syslog { |
注意:
sharedscripts
选项打开后, 所有使用该段配置作 rotate 的目标日志名都会作为参数一次性传给 prerotate/postrotate;
而默认的选项nosharedscripts
则是将每一个日志名分别作为参数传给 prerotate/postrotate;- logrotate 支持的周期单位, 有 hourly, daily, weekly, monthly; 但是这里有坑: hourly 默认是不生效的, 具体原因见本文第三节;
如上所叙, prerotate/postrotate 是一种在 rotate 过程中某个时机回调的一段脚本, 像这样类似的配置项总共有如下几种 (所有的配置项必须与 endscript
成对出现):
1 | # 在所有匹配的日志 rotate 之前, 仅执行一次 |
这几种回调时间点的设计, 不禁让人想到 junit 测试类几种注解的方法执行时机, 不得不说有异曲同工之妙;
rsyslog 的 logrotate 配置是一个典型, 但同时 logrotate 还有着其他的个性化配置选项:
1 | # 以下是另一段案例 |
logrotate 命令的常用运维选项
1.指定目标配置文件, 手动执行:
1 | # 将会执行 /etc/logrotate.d/ 下所有的配置 |
2.debug 验证配置文件正误:
1 | # -d: --debug |
3.强制 rotate:
即便当前不满足 rotate 的条件, force rotate 也会强制作一次 rotate, 而那些超过指定轮数的旧日志将会被删除;
force rotate 比较适用于加入了新的配置文件, 需要对其存量历史立即作一次 rotate;
1 | # -f: --force |
4.verbose 详细信息:
1 | # -v: --verbose |
5.指定 logrotate 自身的日志文件路径:
1 | # -s: --state |
logrotate 的运行原理及其缺陷
logrotate 并不是一个 daemon service, 其本质上只是一个 ‘什么时候调用就什么时候立即执行一次’ 的 C 程序;
所以 logrotate 的执行, 依赖于其他 daemon service 的调用, 那么最自然的就是通过 crond 定时任务来调用了;
默认情况下, logrotate 是一天被调用一次的, 因为与它相关的 crontab 配置在 /etc/cron.daily
里:
1 |
|
如本文第二节所述, 由于 logrotate 的执行方式是通过 cron 默认 1 天执行一次, 所以按小时 rotate 的 hourly
配置项, 默认是不生效的; logrotate 的 manual 文档里也有说明:
hourly
Log files are rotated every hour. Note that usually logrotate is configured to be run by cron daily. You have to change this configuration and run logrotate hourly to be able to really rotate logs hourly.
不过, 这还不是最大的问题, 毕竟我们只要把上述脚本放到 cron.hourly
里, 就能解决该问题;
这种靠定时任务来运行的方式, 最大的问题是: 当我们对某个日志配置成按 size
来 rotate 时, 无法做到当日志触达 size 条件时及时切分, 其所能实现的最小延时是一分钟 (当把 logrotate 脚本的定时任务配成 * * * * *, 即每分钟执行一次时), 没法更短了;
其他的特殊场景
logrotate 集日志切分, 日志压缩, 删除旧日志, 邮件提醒等功能为一体, 提供了非常完整的日志管理策略; 不过, 并不是所有的系统日志, 自身都不具有上述功能, 都需要依赖 logrotate 来管理自己;
有一个非常典型, 而且使用十分广泛的场景: tomcat web 服务器; 当我们在 tomcat 上部署的服务使用了诸如 logback 之类的第三方日志框架时, 日志切分, 日志压缩等服务它自己便能够胜任了 (与 logback 相关功能的文章请见: logback appender 使用总结), 而且我们绝大部分人 (去哪儿网), 即便不怎么接触 logback 的日志压缩功能, 也至少都习惯于使用 logback RollingFileAppender
的基础功能去作日志切分;
基于以上, 我们只需要一个简单的脚本, 便能够满足日常的 tomcat web 服务器日志运维:
1 |
|
本节内容讨论的是针对 tomcat web 系统上的日志切分, 压缩, 以及删除等常规运维内容; 其实, 针对公司各业务线 web 系统的业务日志, 除此之外至少还有另外两项重要的运维内容: 日志冷备份收集 与 日志实时收集及其可视化 (ELK); 与之相关的内容请参见如下文章: