linux日志轮询方案
作者:loveLifeLoveCoding
logrotate 简介
一般来说,日志是任何故障排除过程中非常重要的一部分,但这些日志会随着时间增长。在这种情况下,我们需要手动执行日志清理以回收空间,这是一件繁琐的管理任务。为了解决这个问题,我们可以在 Linux 中配置 logrotate 程序,它可以自动执行日志文件的轮换、压缩、删除和用邮件发出。
我们可以配置 logrotate 程序,以便每个日志文件可以在每天、每周、每月或当它变得太大时处理。
logrotate软件是一个日志管理工具,用于 切割日志,删除旧的日志文件,并创建新的日志文件,起到“转储作用”,可以为系统节省磁盘空间。一般centos系统已经自带安装好了。
logrotate是基于 crontab 运行的,运行时,logrotate 会调用配置文件 /etc/logrotate.conf 。可以在 /etc/logrotate.d 目录里放置自定义好的配置文件,用来覆盖 logrotate.conf 的缺省值。
logrotate 版本查看
root@test 10:14:51:/usr# logrotate --version logrotate 3.11.0
logrotate 配置文件
- 命令:
/usr/sbin/logrotate
- 配置文件:
/etc/logrotate.conf
这是 logrotate 的主配置文件。logrotate 还在 /etc/logrotate.d/
中存储了特定服务的配置。
确保下面的那行包含在 /etc/logrotate.conf 中,以读取特定服务日志配置。 include /etc/logrotate.d`
logrotate 历史:
/var/lib/logrotate/logrotate.status
日志回滚原理
当日志达到某个特定的大小,我们将日志分类,之前的日志保留一个备份,再产生的日志创建一个同名的文件保存新的日志.
重要的 logrotate 选项:
compress 通过gzip 压缩转储以后的日志 nocompress 不做gzip压缩处理 copytruncate 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。 nocopytruncate 备份日志文件不过不截断 create mode owner group 轮转时指定创建新文件的属性,如create 0777 nobody nobody nocreate 不建立新的日志文件 delaycompress 和compress 一起使用时,转储的日志文件到下一次转储时才压缩 nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。 missingok 如果日志丢失,不报错继续滚动下一个日志 errors address 专储时的错误信息发送到指定的Email 地址 ifempty 即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。 notifempty 当日志文件为空时,不进行轮转 mail address 把转储的日志文件发送到指定的E-mail 地址 nomail 转储时不发送日志文件 olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 noolddir 转储后的日志文件和当前日志文件放在同一个目录下 sharedscripts 运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本 prerotate 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行 postrotate 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行 daily 指定转储周期为每天 weekly 指定转储周期为每周 monthly 指定转储周期为每月 rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份 dateext 使用当期日期作为命名格式 dateformat .%s 配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数 size(或minsize) log-size 当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem). 当日志文件 >= log-size 的时候就转储。 以下为合法格式:(其他格式的单位大小写没有试过) size = 5 或 size 5 (>= 5 个字节就转储) size = 100k 或 size 100k size = 100M 或 size 100M
sshd 日志回滚实战
修改配置文件
[root@ localhost cron.daily]# vim /etc/logrotate.conf /var/log/sshd.log { # 指定的是要切割的日志文件 missingok # 如果文件丢失不报错 monthly # 每月轮换一次 create 0664 root utmp # 设置sshd.log这个文件的属主和属组 minsize 10M # 文件超过10M进行回滚 rotate 2 # 日志进行分割后,保留两份历史数据 }
重启rsyslog
[root@ localhost cron.daily]# systemctl restart rsyslog
强制切割
[root@ localhost cron.daily]# logrotate –vf /etc/logrotate.conf [root@ localhost cron.daily]# cd /var/log/ [root@ localhost log]# ll sshd.log -rw------- 1 root root 0 2019-11-29 14:00 sshd.log # 切割完之后,源文件大小变为0
日志切割,是可以按照文件的大小和时间来进行切割
以系统日志/var/log/message做切割来简单说明下:
- 第一次执行完rotate(轮转)之后,原本的messages会变成messages.1,而且会制造一个空的messages给系统来储存日志;
- 第二次执行之后,messages.1会变成messages.2,而messages会变成messages.1,又造成一个空的messages来储存日志!
- 如果仅设定保留三个日志(即轮转3次)的话,那么执行第三次时,则 messages.3这个档案就会被删除,并由后面的较新的保存日志所取代!也就是会保存最新的几个日志。
- 日志究竟轮换几次,这个是根据配置文件中的rotate参数来判定的。
测试和运行 logrotate
如果等不及cron自动执行日志轮转,想手动强制切割日志,需要加-f参数;不过正式执行前最好通过Debug选项来验证一下(-d参数),这对调试也很重要
/usr/sbin/logrotate -f /etc/logrotate.d/nginx /usr/sbin/logrotate -d -f /etc/logrotate.d/nginx
具体 logrotate 命令格式如下:
logrotate [OPTION...] <configfile> -d, --debug :debug 模式,测试配置文件是否有错误。 -f, --force :强制转储文件。 -m, --mail=command :压缩日志后,发送日志到指定邮箱。 -s, --state=statefile :使用指定的状态文件。 -v, --verbose :显示转储过程。
debug 模式
并不会真正进行 rotate 或者 compress 操作,但是会打印出整个执行的流程,和调用的脚本等详细信息。
logrotate -d <configfile>
verbose 模式
会真正执行操作,打印出详细信息。
logrotate -v <configfile>
force 强制执行
如果时间不符合要求,logrotate 也不会真正执行时,如果想要立即执行,查看结果,就使用到了 强制执行模式。
logrotate -f <configfile>
添加 crontab 计划任务
执行 crontab -e
进入 vim 模式,进行编辑。
[root@root local]# crontab -e #每天 23点59分进行日志切割 59 23 * * * /usr/sbin/logrotate -s /tmp/logrotate.status /etc/logrotate.d/tomcat
解释:
59 23 * * * cron表达式
/usr/sbin/logrotate 启动logrotate
-s /tmp/logrotate.status 保存执行状态
/etc/logrotate.d/tomcat 定时任务 ,前提是有 tomcat 文件
tomcat 文件内容:
/soft/tomcat/logs/catalina.out{ minsize 50M rotate 20 compress copytruncate notifempty }
crontab 常用命令
查看所有的定时任务 crontab -l
[root@root local]# crontab -l .....(省略) 59 23 * * * /usr/sbin/logrotate -f /etc/logrotate_mytime/nginx_rotate .....(省略)
编辑定时任务 crontab -e
[root@root local]# crontab -e # 进入vim 模式 .....(省略) 59 23 * * * /usr/sbin/logrotate -f /etc/logrotate_mytime/nginx_rotate .....(省略)
常见应用的 logrotate 配置
/var/log/nginx/*.log { # 可以指定多个路径 daily # 日志轮询周期,weekly,monthly,yearly rotate 30 # 保存30天数据,超过的则删除 size 100M # 超过100M时分割,单位K,M,G,优先级高于daily compress # 切割后压缩,也可以为nocompress delaycompress # 切割时对上次的日志文件进行压缩 dateext # 日志文件切割时添加日期后缀 dateformat -%Y-%m-%d missingok # 如果没有日志文件也不报错 notifempty # 日志为空时不进行切换,默认为ifempty create 640 nginx nginx # 使用该模式创建日志文件 sharedscripts # 所有的文件切割之后只执行一次下面脚本 postrotate if [ -f /run/nginx.pid ]; then kill -USR1 `cat /run/nginx.pid` fi endscript }
logrotate 默认运行时间
logrotate 是基于cron 运行的,所以这个时间是由 cron 控制的,具体可以查询 cron 的配置文件/etc/crontab
。
旧版CentOS 的cron 的配置文件是 /etc/crontab
,新版CentOS 改为 /etc/anacrontab
。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。