技术开发 频道

开源到底在中国能不能发展?

用rotatelogs实现日志轮循

    Apache 提供了不把日志直接写入文件,而是通过管道发送给另外一个程序的能力。这样就大大加强了对日志进行处理的能力。这个通过管道得到的程序可以是任何程序,如日志分析、压缩日志等。要实现将日志写到管道的操作,只需要将配置中日志文件部分的内容替换为“|程序名”即可,例如:

# compressed logs $ CustomLog "|/usr/bin/gzip -c >> /var/log/access_log.gz" common
    这样就可以使用Apache自带的轮循工具rotatelogs来对日志文件进行轮循。rotatelogs基本是按时间或大小来控制日志的。

$ CustomLog "|/www/bin/rotatelogs /www/logs/secfocus/access_log 86400" common
    上面的示例中,Apache访问日志被发送给程序rotatelogs;rotatelogs将日志写入 /www/logs/secfocus/access_log,并每隔86400秒(1天)对日志进行一次轮循。轮循以后的文件名为 /www/logs/secfocus/access_log.nnn,这里nnn是开始记录日志的时间。因此,为了将日志按天对齐需要在凌晨00:00 启动服务,使得每天轮循得到的日志刚好是完整一天的日志,以提供给访问统计分析程序进行处理。如果是00:00开始生成新的日志,那么轮循得到的日志就是 access_log.0000。

用cronolog实现日志轮循

    首先需要下载和安装cronolog,可以到http://www.cronolog.org下载最新版本的cronolog。下载完毕以后,解压安装即可。方法如下所示:

tar xvfz cronolog-1.6.2.tar.gz cd cronolog-1.6.2 ./configure make make check make install
    这样就完成了cronolog的配置和安装,默认情况下cronolog是安装在/usr/local/sbin下。

    修改Apache日志配置命令如下所示:

$ CustomLog "|/usr/local/sbin/cronolog /www/logs/secfocus/%w/access_log" combined
    这里%w表示按照日期在不同的目录下保存日志,这种方式会保存一周的日志。

    为了进行日志分析,需要每天将该日志文件拷贝(或移动,如果不希望保存一周的日志)到一个固定的位置,以方便日志分析统计文件进行处理(使用crontab -e)。添加定时任务如下:

$ 5 0 * * * /bin/mv /www/logs/secfocus/`date -v-1d +\%w`/access_log /www/logs/secfocus/access_log_yesterday
    再使用日志统计分析程序,对文件access_log_yesterday进行处理。

    对于使用负载均衡技术的大型站点,就存在多个服务器的访问日志的合并处理问题。对于这种情况,各个服务器定义或移动日志文件时就不能使用 access_log_yesterday了,而应该带上服务器编号(例如服务器IP地址等信息)加以区分。然后在各个服务器上运行网站镜像和备份服务 rsyncd,再将每个服务器每天的安装配置文件通过rsync下载到专门进行访问统计分析的服务器上进行合并。

    合并多个服务器的日志文件(如log1、log2、log3),并输出到log_all中的方法是:

$ sort -m -t " " -k 4 -o log_all log1 log2 log3
-m表示使用merge优化算法;-k 4表示根据时间进行排序;-o表示将排序结果存放到指定的文件中。
0
相关文章