场景
对于业务系统,每天都会输出大量的日志,并且增长极快,久而久之在有限的容量内总会消耗完服务器的磁盘空间;
当我们遇到故障需要排查的时候,日志往往是第一选择,然而当日志日渐庞大的时候,排查成问题,空间也成问题;
线上埋点系统出现问题,排查发现硬盘被日志撑爆了。
。。。
而logrotate帮我们解决了日志方面的繁琐问题,
- 它支持自动执行日志的(周期性)切割,压缩,删除
- 可以指定目录存放压缩日志文件
- 当执行出错时可以指定email发出邮件报警
简介
logrotate旨在简化对生成大量日志文件的系统的管理。它允许自动旋转,压缩,删除和邮寄日志文件。每个日志文件可以每天,每周,每月或当它变得太大时处理。通常,logrotate作为每天cron任务运行。
安装
主流的Linux系统一般都会自带logrotate包,如果没有,则使用以下命令安装
$ yum install logrotate crontabs
$ logrotate -v
logrotate 3.8.6 - Copyright (C) 1995-2001 Red Hat, Inc.
This may be freely redistributed under the terms of the GNU Public License
Usage: logrotate [-dfv?] [-d|--debug] [-f|--force] [-m|--mail command] [-s|--state statefile]
[-v|--verbose] [-l|--log STRING] [--version] [-?|--help] [--usage] [OPTION...] <configfile>
主配置文件
logrotate的默认配置文件放在 /etc/logrotate.conf
,我们无需对它进行操作
自定义配置文件
logrotate有一个针对日志的自定义配置文件夹 /etc/logrotate.d/
,可以看到系统已经默认配置了syslog、yum等日志管理配置
$ ll /etc/logrotate.d/
-rw-r--r-- 1 root root 76 Aug 2 2018 bootlog
-rw-r--r-- 1 root root 160 Sep 15 2017 chrony
-rw-r--r-- 1 root root 408 Aug 2 2018 psacct
-rw-r--r-- 1 root root 224 Aug 9 2018 syslog
-rw-r--r-- 1 root root 100 Aug 21 2018 yum
执行文件
logrotate的执行文件放在 /usr/sbin/logrotate
详细配置说明
/var/log/logback.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
size 30k
yearly
create 0600 root root
postrotate
# 输入指定的命令
endscript
}
- daily:日志文件按天轮换,还可以配置"weekly","monthly","yearly"。
- rotate count:只能存储的归档文件数量,其他将被删除,如果count为0代表直接删除归档
- compress:每次轮换完成后,将已轮换的归档用gzip压缩
- delaycompress:与compress搭配使用,表示将最近归档文件的压缩推迟到下一个轮换周期
- missingok:若当前日志文件缺少,则不发出错误消息而是继续执行下一个日志文件
- notifempty:若当前日志为空,则不执行轮换
- create mode owner group:在轮换之后,用指定权限创建新的日志文件,mode以八进制指定日志文件的模式(与chmod相同),owner指定将拥有日志文件的用户名,group指定日志文件将属于的组。可以省略任何日志文件属性,在这种情况下,新文件的那些属性将使用与原始日志文件相同的值来表示省略的属性。可以使用nocreate选项禁用此选项
- postrotate/endscript:在所有指令完成后,postrotate和endscript里面指定的命令将被执行
- size size:仅当日志文件大小超过指定字节大小时,才会触发轮换
- dateext:使用当前日期作为命名格式
- dateformat format_string:配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数
更多配置查看官方说明
运行
运行命令
- -d, --debug:开启调试模式,此时不会执行实际操作,但会打印出整个执行流程
- -f, --force:强制轮换文件
- -m, --mail <command>:压缩日志后,发送日志到指定邮箱
- -s, --state=statefile :使用指定的状态文件
- -v, --verbose :显示转储过程
运行方式
-
自动运行
默认情况下, logrotate在安装时已创建了以天为单位的定时任务
$ cat /etc/cron.daily/logrotate #!/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/cron.*/logrotate下配置即可,当然也可以手动配置到crontab上。
-
手动运行
-
debug模式(logrotate -d <configfile>)
$ logrotate -d /etc/logrotate.d/custom-log
-
verbose模式(logrotate -v <configfile>)
$ logrotate -v /etc/logrotate.d/custom-log
-
强制模式(logrotate -vf <configfile>)
$ logrotate -vf /etc/logrotate.d/custom-log
-
问题处理
-
强制模式不起作用
删除记录状态的文件
$ rm /var/lib/logrotate/logrotate.status
-
日志文件为空无法执行
那就让它不为空呗
-
使用nohup进行日志输出,接着日志切割后,原日志大小不变
改变nohup输出方式:nohup xxx.sh >> nohup.out &,要有两个>
大概就是这样,让我们尝试接入到我们的系统内吧!
Ending......
请关注微信公众号:进击的阿黑,谢谢。