当前位置: 首页 > 图文教程 > 服务器 > 安全防护 > 多服务器的日志合并统计(3)

安全防护
服务器安全设置(十六)
服务器安全设置(十七)
服务器安全设置(十八)
服务器安全设置(十九)
服务器安全设置(二十)
服务器安全设置(二十一)
服务器安全设置(二十二)
Windows Server 2003 虚拟主机的安全配置
Win2000 Server入侵监测
Web服务器的安全和攻击防范 (一)
Web服务器的安全和攻击防范 (二)
Web服务器的安全和攻击防范 (三)
Web服务器的安全和攻击防范 (四)
Web服务器的安全和攻击防范 (五)
安全配置和维护Apache WEB Server (上)
安全配置和维护Apache WEB Server (下)
安全性与IIS (一)
安全性与IIS (二)
安全性与IIS (三)
安全性与IIS (四)

安全防护 中的 多服务器的日志合并统计(3)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-29   浏览: 44 ::
收藏到网摘: n/a

  首先考虑了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 把每天的c