Linux使用logrotate来切割日志文件

2017-05-04 17:25:33 9447

程序在运行的时候为了了解运行状态,会输出日志文件,时间久了日志文件会变得非常大,甚至达到GB级别。我在golang应用里使用logrus包来打日志,配置和使用都很方便,就是没有日志分割的功能,应用在线上运行一个月后日志文件都已经达到上百兆。后来发现了logrotate,这是centos自带的日志分割工具,都不用安装额外组件就能实现定时分割日志。

1.运行原理

logrotate由系统的cron运行,位置在/etc/cron.daily/logrotate

?

1
2
3
4
5
6
7
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
 /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

可以看到入口配置文件是/etc/logrotate.conf,依次运行/etc/logrotate.conf.d里的配置文件 如果发现配置的logrotate没有执行,可以看下系统的crond服务有没有开启

2.配置

如果有安装nginx,可以参考nginx里的配置例子

?

1
2
3
4
5
6
7
8
9
10
11
12
/var/log/nginx/*log {
 create 0644 nginx nginx
 daily
 rotate 10
 missingok
 notifempty
 compress
 sharedscripts
 postrotate
  /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
 endscript
}

第一行定义的是日志文件的路径,可以用*通配,一般可以定义成*.log来匹配所有日志文件。也可以指定多个文件,用空格隔开,比如

?

1
2
3
/var/log/nginx/access.log /var/log/nginx/error.log {
  
}

花括号里面是日志切割相关的参数,下面是常用的切割参数

  1. compress 是否开启压缩,压缩格式gzip

  2. 不开启压缩

  3. compresscmd 自定义压缩命令

  4. compressexty 压缩文件名后缀

  5. compressoptions 压缩选项

  6. copy 复制一份文件

  7. create 后面跟mode owner group,设置新日志文件的权限

  8. daily 按天分割

  9. weekly 按周分割

  10. monthly 按月分割

  11. rotate 后面跟数字,表示需要保留的文件历史记录,超过数量就会删除,或者通过邮件发送

  12. size 后面跟文件大小,比如100k、100M,超过这个大小后分割

  13. missingok 忽略不存在的文件,不报错

  14. notifempty 不分割空文件

  15. sharedscripts 配合postrotate、prerotate,让他们只执行一次

  16. postrotate/endscript 文件分割完后,执行postrotate、endscript之间的命令

  17. prerotate/endscript 文件分割完前,执行prerotate、endscript之间的命令

下面看几个例子

?

1
2
3
4
5
6
7
8
9
/var/log/httpd/error.log {
 rotate 5
 mail i@wuyuans.com
 size=100k
 sharedscripts
 postrotate
  /sbin/killall -HUP httpd
 endscript
}

切割/var/log/httpd/error.log日志文件,超过100k后切割,保留最新的5个历史记录,超过5个的邮件发送到fss@qq.com,postrotate里的的命令是为了让httpd重新打开日志文件。

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/var/lib/mysql/mysqld.log {
 # create 600 mysql mysql
 notifempty
 daily
 rotate 3
 missingok
 compress
 postrotate
 # just if mysqld is really running

提交成功!非常感谢您的反馈,我们会继续努力做到更好!

这条文档是否有帮助解决问题?

非常抱歉未能帮助到您。为了给您提供更好的服务,我们很需要您进一步的反馈信息:

在文档使用中是否遇到以下问题: