web日志分析方案

      最近在研究web日志分析统计方案,公司要根据web日志获取一些信息,现在有两个方向:一个是实时日志分析,一个是非实时的分析。要求是利用开源软件组合一套适合本公司情况的日志分析系统,而且还扩展性好,能抗住大量的日志分析。也不打算做二次开发,拿来直接使用,既然不打算投入那就先用非实时的分析系统。

一般也就是以下几个步骤:

   日志生成/日志传输/日志合并/日志分析

非实时的日志分析架构

       [webServer]  [webServer]  [webServer]
	      (use cronolog cron log)
             \          |           /
               use FTP/SCP/Rsync cmd 
		(transport daily log)
                 |       |       |
             [Collect Logging Server] 
		(sort merge && analytics)
                   /          \
        [report stats]     [report stats] 


1 日志生成

    公司web日志无非就是apache和nginx之类的日志格式,在web配置文件中针对所需要获取的日志信息,对日志格式进行定制。这样日志中就有你所需要的信息了,问题是这时的日志会源源不断的记录在同一个文件中,而且文件会越来越大,而一般情况下是不建议在业务服务器上直接分析日志的,都是在一台单独的非业务服务器上对日志进行分析。公司能接受的分析结果是最迟延迟一天,这样我们就需要对日志按天为单位进行切割。以天为单位切割日志有很多种方法,很多人都会想到晚上0点的时候通过crontab任务直接移除log日志,直接mv掉log日志后,必须重启web服务才会生成新的log日志文件,否则是不会有新的log日志文件的,如果不想重启web服务,则可以通过cp来移除log日志文件,然后再清空日志文件。但是以上两种方法都有时间差的问题,就是在移动日志到生成新的空日志的时间短内的数据会丢失,如果老的log日志文件很大,动辄几个G,这样在移动时也是很耗费时间的。而且cp不能保证就是0点准截断日志的,这样在移动出来的log日志中会有几行是当天的日志记录。而新的日志文件中记录的时间戳并不是从0点整开始记录的。现在面临的问题就是每天生产一个时间严格限制在00:00:00-23:59:59的日志文件。在linux下有个logrotate服务,它是专门用来对各种日志进行轮训的后台服务,可以按时间、大小进行切分日志,然后进行压缩打包。不过看了该工具的实现后发现也是晚上通过重启web服务实现的。最后发现了一个apache官方推荐的cronolog工具,可以在web配置文件中直接使用该命令按天轮训日志。我们每台主机上有多个虚拟主机,所以在日志轮训时生成的log文件名由域名、日期和本机IP构成。

2 日志传输

    所有的web站点都是运行在负载均衡模式下,这样就意味着一个站点会有多个日志文件,所以在上面的日志轮训中要标明改日志是属于那一台主机的,当确认日志轮训完毕后,先压缩日志文件,然后利用scp、ftp、rsync等命令把日志上传到日志收集服务器上,在日志收集服务器上,对同一天的一个域名的日志文件进行解压,这时所有该域名的单个日志都是一件排序好的。

3 日志合并

    对于单个日志文件本身已经是按照时间排序的文件,sort命令有个合并选项可以提供优化的合并算法,使用-m选项。或者使用awstats的logresolvemerge.pl命令来合并日志。

4 日志分析

    在日志合并好之后,可以利用开源的工具进行分析,webalizer和awstats都可以分析apache的日志,可以根据需求任选一个,根据软件的实现机制,分析出的数据可能有些差距。

   非实时日志分析中,关键点在于轮训生成合理的日志文件,对于后面的合并分析则交给开源工具去操作。


实时的日志分析

    web日志文件要实时分析不是绝对的实时,而是有少量的延时。如果要在业务服务器上实时分析web日志,相信没有多少企业会这样操作的。对于实时分析,我们就是让产生的web访问日志及时的发送到日志收集服务器上,然后通过分析程序进行分析。虽然目前网络上还很少有开源的实时日志分析软件,但是可以利用一些工具组装出来一个。可以尝试scribe+hadoop方案。



你可能感兴趣的:(web日志分析)