当前位置:萝卜系统 > 网络技术教程 > 详细页面

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

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

更新时间:2021-05-09 文章作者:未知 信息来源:网络 阅读次数:

网络技术是从1990年代中期发展起来的新技术,它把互联网上分散的资源融为有机整体,实现资源的全面共享和有机协作,使人们能够透明地使用资源的整体能力并按需获取信息。资源包括高性能计算机、存储资源、数据资源、信息资源、知识资源、专家资源、大型数据库、网络、传感器等。 当前的互联网只限于信息共享,网络则被认为是互联网发展的第三阶段。
首先考虑了apache/bin目录下自带的一个轮循工具:rotatelogs 这个工具基本是用来按时间或按大小控制日志的,无法控制何时截断和如何按天归档。

  然后考虑logrotate后台服务:logrotate是一个专门对各种系统日志(syslogd,mail)进行轮循的后台服务,比如SYSTEM LOG,但其配置比较复杂,放弃,实际上它也是对相应服务进程发出一个-HUP重启命令来实现日志的截断归档的。

  在apache的FAQ中,推荐了经过近2年发展已经比较成熟的一个工具cronolog:安装很简单:


  configure=>make=> make install



  他的一个配置的例子会让你了解它有多么适合日志按天轮循:对httpd.conf做一个很小的修改就能实现:


  TransferLog "|/usr/sbin/cronolog /web/logs/%Y/%m/%d/access.log"
  ErrorLog "|/usr/sbin/cronolog /web/logs/%Y/%m/%d/errors.log"



  然后:日志将写入


  /web/logs/2002/12/31/access.log
  /web/logs/2002/12/31/errors.log



  午夜过后:日志将写入


  /web/logs/2003/01/01/access.log
  /web/logs/2003/01/01/errors.log



  而2003 2003/01 和 2003/01/01 如果不存在的话,将自动创建

  所以,只要你不在0点调整系统时间之类的话,日志应该是完全按天存放的(00:00:00-23:59:59),后面日志分析中:[31/Mar/2002:15:44:59这个字段就和日期无关了,只和时间有关。

  测试:考虑到系统硬盘容量,决定按星期轮循日志

  apache配置中加入:


  #%w weekday
  TransferLog "|/usr/sbin/cronolog /path/to/apache/logs/%w/accesserials_log"



  重启apache后,除了原来的CustomLog /path/to/apche/logs/accesserials_log继续增长外,系统log目录下新建立了 3/目录(测试是在周3),过了一会儿,我忽然发现2个日志的增长速度居然不一样!

  分别tail了2个日志才发现:

  我设置CustomLog使用的是combined格式,就是包含(扩展信息的),而TransferLog使用的是缺省日志格式,看了apache的手册才知道,TransferLog是用配置文件中离它自己最近的一个格式作为日志格式的。我的httpd.conf里写的是:


  LogFormat ..... combined
  LogFormat ... common
  ...
  CustomLog ... combined
  TransferLog ...



  所以TrasferLog日志用的是缺省格式,手册里说要让TRANSFER日志使用指定的格式需要:


  LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i""
  TransferLog "|/usr/local/sbin/cronolog /path/to/apache/logs/%w/accesserials_log"



  重启,OK,日志格式一样了。

  这样的设置结果其实是同时在logs目录下分别记录2个日志accesserials_log和%w/accesserials_log,能不能只记录%w/下的日志那?

  查apache手册,更简单的方法:直接让CustomLog输出到cronolog归档日志,并且还能指定格式。


  CustomLog "|/usr/local/sbin/cronolog
    /path/to/apache/logs/%w/accesserials_log" combined



  最后是一个日志同步的问题。

  任务:每天凌晨找到前1天的日志,另存一个文件准备发送到服务器上。

  比如我要保留前1周的日志:每天复制前1天的日志到指定目录,等待日志服务器来抓取:


  /bin/cp /path/to/logs/`date -v-1d +%w`/accesserials_log
     /path/to/sync/logs/accesserials_yesterday



  在FREEBSD上使用以下命令


  date -v-1d +%w



  注释:
  -v-1d: 前1天,而在LINUX上这个选项应该是date -d yesterday
  +%w: weekday,由于使用的都是标准时间函数库,所有工具中的WEEKDAY定义都是一样的 0-6 => 周日-周六

  注意:写到CRONTAB里的时候"%"前面需要加一个""转义:每天0点5分进行一次日志归档


  5 0 * * * /bin/cp /path/to/logs/`date -v-1d +%w`/accesserials_log
   /path/to/for_sync/logs/accesserials_yesterday



  首次开始cronolog日志统计是周3,一周以后日志又将轮循回3/accesserials_log

  但这次日志是追加到3/accesserials_log还是重新创建一个文件呢?>>accesserials_log or >accesserials_log?

  我测试的结果是日志将被追加:


  [01/Apr/2002:23:59:59 +0800]
  [01/Apr/2002:23:59:59 +0800]
  [08/Apr/2002:00:00:00 +0800]
  [08/Apr/2002:00:00:00 +0800]



  肯定是不希望每次日志还带着上周的数据的并重复统计一次的(虽然对结果没影响),而且这样%w/下的日志不是也越来越多了吗?

  解决方法1 把每天的cp改成mv

  解决方法2 每天复制完成后:删除6天以前的accesserials_log日志


  find /path/to/apache/logs -name accesserials_log -mtime +6 -exec rm -f {};



  多保留几天的日志还是有必要的:万一日志分析服务器坏了一天呢?

总结:

  1 用 cronolog 干净,安全地轮循日志

  2 用 sort -m 排序合并多个日志

参考资料:

  日志分析统计工具:
  http://directory.google.com/Top/Computers/Software/
    Internet/Site_Management/Log_Analysis/

  Apche的日志设置:
  http://httpd.apache.org/docs/mod/mod_log_config.html

  apache的日志轮循:
  http://httpd.apache.org/docs/misc/FAQ.html#rotate

  cronolog:http://www.cronolog.org


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

温馨提示:喜欢本站的话,请收藏一下本站!

本类教程下载

系统下载排行

网站地图xml | 网站地图html