目的:测试监控在日志做切割时是否正常取到数据,并且无数据丢失或重复。
理论上:logrotate是通过mv进行日志的切换,而监控则是通过检查文件的最近修改时间来判断是否读取文件内容,所以从理论上来说是不会丢失数据的,但还需要进行检测下
初期思路:模拟日志的产生,不停的写数据到一文件中,让监控端监控这一文件,然后模拟logrotate机制,对文件进行切割,最后检查监控端取到的数据是的和本地的一样,完成测试。
写入的脚本如下:
[root@redhat logtest]# cat w.sh #!/bin/bash echo start > /logtest/testlog for j in {1..600} do for i in {1..1000} do echo $j time $i >> /logtest/testlog done done
切换的脚本如下:
[root@redhat logtest]# cat c.sh #!/bin/bash mv /logtest/testlog /logtest/testlog.1
本地的测试结果:
[root@redhat logtest]# tail testlog.1 110 time 148 110 time 149 110 time 150 110 time 151 110 time 152 110 time 153 110 time 154 110 time 155 110 time 156 110 time 157 [root@redhat logtest]# head testlog 110 time 158 110 time 159 110 time 160 110 time 161 110 time 162 110 time 163 110 time 164 110 time 165 110 time 166 110 time 167
可以看到本地是没有丢失数据的,而监控端监控本地的testlog*文件;由于监控端的问题,没有取到本地的数据,该检测方案终止
后来想到,本地安装了syslog服务器,而本地的/var/log/message*是很早就被监控端监控着的,于是想到第二套方案:
手动进行日志切换,检查监控端是否有数据的丢失或者重复:
logrotate在很多Linux发行版上都是默认安装的。系统会定时运行logrotate,一般是每天一次。系统是这么实现按天执行的。crontab会每天定时执行 /etc/cron.daily 目录下的脚本,而这个目录下有个文件叫logrotate 。在测试服务器上脚本内容是这样的:
[root@bppmis /]# cd /etc/cron.daily/ [root@bppmis cron.daily]# ls cups logrotate makewhatis.cron mlocate.cron prelink readahead.cron rhsmd tmpwatch [root@bppmis cron.daily]# cat logrotate #!/bin/sh /usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1 EXITVALUE=$? if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" fi exit 0 [root@bppmis cron.daily]#
可以看到logrotate被crontab调用,每天运行一次,
由于测试的日志服务器一直没有安装crontab,所以所有接受到的日志都存放在/var/log/message中,手动切割日志:
/usr/sbin/logrotate -vf /etc/logrotate.conf >/dev/null 2>&1
最后对比本地文件内容和监控端取到的内容进行对比,发现没有数据丢失及重复;测试通过。
该测试不足之处,望大家指点。
原文地址:http://qiushi.blog.51cto.com/6450559/1690574