Chinaunix首页 | 论坛 | 博客
  • 博客访问: 506278
  • 博文数量: 105
  • 博客积分: 3040
  • 博客等级: 中校
  • 技术积分: 1450
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-08 13:04
文章分类

全部博文(105)

文章存档

2008年(105)

我的朋友

分类: LINUX

2008-05-09 09:36:39

研究解决awstats等日志分析软件对日志数据的时间顺序敏感性

:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明。
研究解决awstats等日志分析软件对日志数据的时间顺序敏感性

问题提出:
awstats分析多个日志文件时,如果日志文件之间的时间不是顺序排列的
比如不是 access.log.20060506 access.log.20060507 样子的多个文件
而是 access.log.20060507.ip1  access.log.20060507.ip2  access.log.20060507.ip3
显然 三个IP产生的日志文件的时间各自都是顺序的 但三者之间是个混乱的先后关系
此时 如果用awstats顺序处理三个日志文件 得到的结果会有错

如: awstats-6.5/wwwroot/cgi-bin/awstats.pl -update -config=ipcn.org
Update for config "/etc/awstats/awstats.ipcn.org.conf"
With data in log file "/opt/squid/logs/access.log.20060507.ip2"...
Phase 1 : First bypass old records, searching new record...
Direct access to last remembered record has fallen on another record.
So searching new records from beginning of log file...
Jumped lines in file: 0
Parsed lines in file: 92378
 Found 17 dropped records,
 Found 0 corrupted records,
 Found 92361 old records,
 Found 0 new qualified records.

从前面的消息可以看到 Found 92361 old records,
于是 这个文件的数据就都被歧视了 没有进入结果统计


问题分析:
awstats第一次处理日志之后会在处理结果数据文件awstats052006.ipcn.org.txt中记录LastLine信息
如:
LastLine 20060507235900 114232 15090725 26297835870

后面再分析日志时,会先从之前处理结果中取出 LastLine 赋值给 变量 $LastLine
然后再分析日志时,会比对当前数据的时间信息和 $LastLine 的大小
			if ($timerecord <= $LastLine) {	# Already processed
				$NbOfOldLines++;
				next;
			}
可以看出 当新日志文件的数据时间在上次分析的时间之前时 则直接 next 跳过忽略
于是就产生了前面的问题: 第二、第三、...个日志文件的信息没有正确算入统计


问题解决:
通过上面的分析可以看到 要解决这个问题可以从两方面考虑
1 日志数据
2 分析程序

日志数据方面可以做的改动是:
awstats处理之前处理一下日志数据 让日志按照时间顺序准备好
方案一:日志集中收集,所有服务器实时把数据发到日志收集服务器上
        还要保证各个服务器的时间严格正确/一致
方案二:日志定期归档后汇总,通过sort把所有日志合并成严格按时间顺序的一个日志文件
        由于各个日志自己都是时间顺序排列的,所以可以利用 sort 的 -m merge 选项处理
        sort -m -t : -k 2,4 -o access.log access.log.ip1 access.log.ip2
        这里日志不能跨天归档,也就是说至少必须每天归档一次
        比如每天 从00:00:00 到 23:59:59 的数据正确归档后
        然后再把漂亮的数据交给awstats处理
阅读(1906) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~