网站首页/网络技术列表/内容

多服务器的日志合并统计(1)

网络技术2021-05-09阅读
网络技术是从1990年代中期发展起来的新技术,它把互联网上分散的资源融为有机整体,实现资源的全面共享和有机协作,使人们能够透明地使用资源的整体能力并按需获取信息。资源包括高性能计算机、存储资源、数据资源、信息资源、知识资源、专家资源、大型数据库、网络、传感器等。 当前的互联网只限于信息共享,网络则被认为是互联网发展的第三阶段。
内容摘要:你完全不必耐心地看完下面的所有内容,因为结论无非以下2点:
  1 用 cronolog 干净,安全地轮循apache“日”志
  2 用 sort -m 合并排序多个日志

  根据个人的使用经历:
  1 先介绍apache日志的合并方法;
  2 然后根据由此引出的问题说明日志轮循的必要性和解决方法,介绍如何通过cronolog对apache日志进行轮循;

  中间有很多在设计日志合并过程中一些相关工具的使用技巧和一些尝试的失败经历……

  我相信解决以上问题的路径不止这一条途径,以下方案肯定不是最简便或者说成本最低的,希望能和大家有更多的交流。

{0} 多服务器日志合并统计的必要性:

  越来越多大型的WEB服务使用DNS轮循来实现负载均衡:使用多个同样角色的服务器做前台的WEB服务,这大大方便了服务的分布规划和扩展性,但多个服务器的分布使得日志的分析统计也变得有些麻烦。如果使用webalizer等日志分析工具对每台机器分别做日志统计: 1 会对数据的汇总带来很多麻烦,比如:统计的总访问量需要将SERVER1 SERVER2...上指定月份的数字相加。 2 会大大影响统计结果中唯一访客数unique visits,唯一站点数unique sites的等指标的统计,因为这几个指标并非几台机器的代数相加。

  统一日志统计所带来的好处是显而易见的,但如何把所有机器的统计合并到一个统计结果里呢?

  首先也许会想:多个服务器能不能将日志记录到同一个远程文件里呢?我们不考虑使用远程文件系统记录日志的问题,因为带来的麻烦远比你获得的方便多的多……

  因此,要统计的多个服务器的日志还是:分别记录=>并通过一定方式定期同步到后台=>合并=>后用日志分析工具来进行分析。

  首先,要说明为什么要合并日志:因为webalizer没有将同一天的多个日志合并的功能

  先后运行


  webalizer log1
  webalizer log2
  webalizer log3



  这样最后的结果是:只有log3的结果。

  能不能将log1<

  因为一个日志的分析工具不是将日志一次全部读取后进行分析,而且流式的读取日志并按一定时间间隔,保存阶段性的统计结果。因此时间跨度过大(比如2条日志间隔超过5分钟),一些日志统计工具的算法就会将前面的结果“忘掉”。因此, log1<

{1} 日志合并问题

  多个服务的合并统计就是要把日志按时间排序后合并成一个文件

  典型的多个日志文件的时间字段是这样的:


  log1     log2     log3
  00:15:00   00:14:00   00:11:00
  00:16:00   00:15:00   00:12:00
  00:17:00   00:18:00   00:13:00
  00:18:00   00:19:00   00:14:00
  14:18:00   11:19:00   10:14:00
  15:18:00   17:19:00   11:14:00
  23:18:00   23:19:00   23:14:00



  日志合并必须是按时间将多个日志的交叉合并。合并后的日志应该是:


  00:15:00 来自log1
  00:15:00 来自log2
  00:16:00 来自log1
  00:17:00 来自log3
  00:18:00 来自log2
  00:19:00 来自log1
  ....



  如何合并多个日志文件?

  下面以标准的clf格式日志(apache)为例:

  apche的日志格式是这样的:


  %h %l %u %t "%r" %>s %b



  具体的例子:


  111.222.111.222 - - [03/Apr/2002:10:30:17 +0800]
  "GET /index.html HTTP/1.1" 200 419



  最简单的想法是将日志一一读出来,然后按日志中的时间字段排序


  cat log1 log2 log3 |sort -k 4 -t " "



  注释:
  -t " ": 日志字段分割符号是空格
  -k 4: 按第4个字段排序,也就是:
        [03/Apr/2002:10:30:17 +0800] 这个字段
  -o log_all: 输出到log_all这个文件中

  但这样的效率比较低,要知道。如果一个服务已经需要使用负载均衡,其服务的单机日志条数往往都超过了千万级,大小在几百M,这样要同时对多个几百M的日志进行排序,机器的负载可想而之……

  其实有一个优化的途径,要知道:即使单个日志本身已经是一个“已经按照时间排好序“的文件了,而sort对于这种文件的排序合并提供了一个优化合并算法:使用 -m merge合并选项,

  因此:合并这样格式的3个日志文件log1 log2 log3并输出到log_all中比较好方法是:


  sort -m -t " " -k 4 -o log_all log1 log2 log3



  注释:
  -m: 使用 merge优化算法

  注意:合并后的日志输出最好压缩以后再发给webalizer处理

  有的系统能处理2G的文件,有的不能。有的程序能处理大于2G的文件,有的不能。尽量避免大于2G的文件,除非确认所有参与处理的程序和操作系统都能处理这样的文件。所以输出后的文件如果大于2G,最好将日志gzip后再发给webalizer处理:大于2G的文件分析过程中文件系统出错的可能性比较大,并且gzip后也能大大降低分析期间的I/O操作。

  日志的按时间排序合并就是这样实现的。


网络的神奇作用吸引着越来越多的用户加入其中,正因如此,网络的承受能力也面临着越来越严峻的考验―从硬件上、软件上、所用标准上......,各项技术都需要适时应势,对应发展,这正是网络迅速走向进步的催化剂。

……

相关阅读