本文主要介绍Linux系统下的日志分割工具,Split 和 Logrotate。
Split
Linux 系统自带简单日志文件分割工具。
常用参数列表:
| 选项 | 含义 |
|---|---|
| -b | 分割后的文档大小,单位是byte |
| -C | 分割后的文档,单行最大byte数 |
| -d | 使用数字作为后缀(default: 字母),同时使用-a length(default: 2)指定后缀长度 |
| -l | 分割后文档的行数 |
| –verbose | 显示输出详细信息 |
示例:
| |
Logrotate
简介及解决方案
Logrotate,即Log rotation日志滚动,属于Linux系统自带工具,基于crontab实现时间点滚动日志,计划每天运行的脚本位于 /etc/cron.daily/logrotate。
GitHub 地址:https://github.com/logrotate/logrotate
logrotate 是怎么做到滚动日志时不影响程序正常的日志输出呢?logrotate 提供了两种解决方案。
- create
- copytruncate
create
这也就是默认的方案,可以通过 create 命令配置文件的权限和属组设置;这个方案的思路是重命名原日志文件,创建新的日志文件。详细步骤如下:
- 重命名正在输出日志文件,因为重命名只修改目录以及文件的名称,而进程操作文件使用的是 inode,所以并不影响原程序继续输出日志。
- 创建新的日志文件,文件名和原日志文件一样,注意,此时只是文件名称一样,而 inode 编号不同,原程序输出的日志还是往原日志文件输出。
- 最后通过某些方式通知程序,重新打开日志文件;由于重新打开日志文件会用到文件路径而非 inode 编号,所以打开的是新的日志文件。
如上也就是 logrotate 的默认操作方式,也就是 mv+create 执行完之后,通知应用重新在新文件写入即可。mv+create 成本都比较低,几乎是原子操作,如果应用支持重新打开日志文件,如 syslog, nginx, mysql 等,那么这是最好的方式。
不过,有些程序并不支持这种方式,压根没有提供重新打开日志的接口;而如果重启应用程序,必然会降低可用性,为此引入了如下方式。
copytruncate
该方案是把正在输出的日志拷 (copy) 一份出来,再清空 (trucate) 原来的日志;详细步骤如下:
- 将当前正在输出的日志文件复制为目标文件,此时程序仍然将日志输出到原来文件中,此时,原文件名也没有变。
- 清空日志文件,原程序仍然还是输出到预案日志文件中,因为清空文件只把文件的内容删除了,而 inode 并没改变,后续日志的输出仍然写入该文件中。
如上所述,对于 copytruncate 也就是先复制一份文件,然后清空原有文件。
通常来说,清空操作比较快,但是如果日志文件太大,那么复制就会比较耗时,从而可能导致部分日志丢失。不过这种方式不需要应用程序的支持即可。
- 执行文件:
/usr/sbin/logrotate - 主配置文件:
/etc/logrotate.conf - 自定义配置文件:
/etc/logrotate.d/*.conf - 执行状态文件:
/var/lib/logrotate/logrotate.status
运行 logrotate
logrotate 命令格式及常用参数如下所示:
| |
通常使用的方法是配合crontab来运行:
| |
手动调用 logrotate:
| |
配置文件详解
这里以系统自带的部分/etc/logrotate.d/rsyslog配置文件为例:
| |
monthly: 日志文件将按月轮循。其它可用值为daily,weekly或者yearly。rotate 5: 一次将存储 5 个归档日志。对于第六个归档,时间最久的归档将被删除。compress: 在轮循任务完成后,已轮循的归档将使用gzip进行压缩。delaycompress: 总是与 compress 选项一起用,delaycompress 选项指示 logrotate 不要将最近的归档压缩,压缩 将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。missingok: 在日志轮循期间,任何错误将被忽略,例如 “文件无法找到” 之类的错误。notifempty: 如果日志文件为空,轮循不会进行。create 644 root root: 以指定的权限创建全新的日志文件,同时 logrotate 也会重命名原始日志文件。postrotate/endscript: 在所有其它指令完成后,postrotate 和 endscript 里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。
其他常用参数:
tabooext [+] list:让 logrotate 不转储指定扩展名的文件,缺省的扩展名是.rpm-orig, .rpmsave, v, 和~missingok:在日志轮循期间,任何错误将被忽略,例如 “文件无法找到” 之类的错误。size size:当日志文件到达指定的大小时才转储,bytes (缺省) 及 KB (sizek) 或 MB (sizem)copytruncate:用于还在打开中的日志文件,把当前日志备份并截断nocopytruncate: 备份日志文件但是不截断create mode owner group: 转储文件,使用指定的文件模式创建新的日志文件nocreate: 不建立新的日志文件nodelaycompress: 覆盖 delaycompress 选项,转储同时压缩。errors address: 专储时的错误信息发送到指定的 Email 地址ifempty:即使是空文件也转储,这个是 logrotate 的缺省选项。mail address: 把转储的日志文件发送到指定的 E-mail 地址nomail: 转储时不发送日志文件olddir directory:储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统noolddir: 转储后的日志文件和当前日志文件放在同一个目录下
logrotate 日志切割轮询
由于 logrotate 是基于cron运行的,所以这个日志轮转的时间是由 cron 控制的,具体可以查询 cron 的配置文件 /etc/anacrontab,过往的老版本的文件为(/etc/crontab)
使用 crontab 来作为日志轮转的触发容器来修改 logrotate 默认执行时间:
| |
附:logrotate 配置文件示例
- syslog
| |
- zabbix-agent
| |
- nginx
| |
- influxdb
| |