Awstats处理多apache日志

作者:田逸([email protected])
首发:[url]http://server.it168.com/server/2007-12-04/200712041012131.shtml[/url]
 
linux 环境下,开源工具 Awstats 是一个非常受欢迎的网站日志处理工具。在 linux 环境安装和配置 awstats 比较容易成功,但要同时处理多个 apache 日志(比如 web 集群的环境),还是有许多工作需要做的。
 
平台环境
1、  服务器 3 个, 2 个运行 apache web 服务器,一个专门处理日志的 Awstats 服务器。
2、  运行平台:全部为 redhat AS 4
 
设计思路
日志处理服务器每天定期从 2 apache 服务器获取日志文件,对取得的压缩文件解压,接着把 2 个单独的日志文件合并成一个,再用 awstats 处理生成报告。下面我们就按照这个思路来进行具体的部署。
 
一、 Apache 日志的生成和处理
 
1、  apache 日志生成:
通过修改 apache 的配置文件 httpd.conf 来达到这个目的,下面是某个 apache 服务器的配置文件关于日志记录的修改部分:
  SetEnvIf Request_URI \.gif image-request
    SetEnvIf Request_URI \.jpg image-request
    SetEnvIf Request_URI \.png image-request
    SetEnvIf Request_URI \.js image-request
    SetEnvIf Request_URI \.css image-request
    SetEnvIf Request_URI \.swf image-request
    ErrorLog /var/log/web/sery.com-error_log
CustomLog "|/opt/apache2/bin/rotatelogs /var/log/web/sery.com-access%Y%m%d.log.%H 28800 480" combined env=!image-request
在这里简单说明一下上面各个项目的意义。 SetEnvIf Request_URI 设置判断环境变量“ image-request ,“ CustomLog "|/opt/apache2/bin/rotatelogs /var/log/web/sery.com-access%Y%m%d.log.%H 28800 480" combined env=!image-request
”表示不记图片请求所产生的日志,并且使用 apache 的日志轮转工具 rotatelogs 对日志进行分割,以年月日及小时方式命名文件,这样用脚本处理日志时就非常方便了。这个 CustomLog 有点特别,不要把命令前面的 ”|” 等符号写丢了。通过运行 apache 服务,将在目录 /var/log/web/ 生成日志文件 sery.com-access20071120.log.00.
由于使用了日志轮转功能,从上图可以看见 2 个日志文件。
 
1、  日志备份和压缩:
进入日志所在的目录,把同一天不同时间段的日志合并成一个文件,压缩后移动到另外的一个位置 /var/log/weblog-backup 为什么要把它放在另外的位置并且压缩呢?主要的原因是为了在传输时节省时间。当然我们不可能每天手动来执行这个操作,自然而言,用shell脚本来干这个事情了。下面给出脚本的内容:
#!/bin/sh
lastlogdate=`date "+%Y%m%d"  -d yesterday`
 
touch /var/log/web/sery.com-access$lastlogdate.log
for i in /var/log/web/sery.com-access$lastlogdate.log.*
do cat $i >> /var/log/web/sery.com-access$lastlogdate.log
rm -f $i
done
 
touch /var/log/web/sery.com-access$lastlogdate.log
gzip /var/log/web/sery.com-access$lastlogdate.log
 
if [[ -f /var/log/web/sery.com-access$lastlogdate.log.gz ]]
  then
  mv /var/log/web/sery.com-access$lastlogdate.log.gz /var/log/weblog-backup/
fi
 
rm -rf `find /var/log/weblog-backup/ -atime 7`
把这个脚本命名为 merge_log.sh, 放在目录 /usr/local/bin 下面 , 并赋予执行权限。然后在自动任务里加入这个任务,让它每天自动执行一次。运行 crontab �Ce 把下面的行加入其中:
   5 0 * * * /usr/local/bin/merge_log.sh
为检查脚本的正确性,至少手动执行一遍脚本 merge_log.sh ,看是否在目录 /var/log/weblog_backup 生成压缩文件。如果如愿生成类似 sery.com-access20071119.log.gz 这样的文件,表明脚本正确地按照我们的意图工作了。
 
2、  允许 awstats 取得 apache 的日志文件:
部署 ftp 服务,创建一个 ftp 用户,然后把这个 ftp 的用户目录定位到“ /var/log/weblog-backup ”, 即第2步生成压缩文件的目录 使用下列的命令产生ftp用户和指定目录:
[root@www1 ~]# useradd �Cd /var/log/weblog-backup  -s  /sbin/nologin sery
[root@www1 ~]# passwd sery
[root@www1 ~]# chmod 755 �CR /var/log/weblog-backup
由于 vsftpd 配置非常容易,这里就不再多说。启用 ftp 服务,用刚才创建的用户测试一下,看是否可以看见“ /var/log/weblog_back ”里的文件。
 
到这一步,我们需要在 apache 服务器上进行的操作就结束了。多个 apache 服务器,只需要重复上面的操作即可。当然,为了适应你自己的环境,请自行修改相关的目录和文件。
 
一、 获取日志文件
awstats 服务器从 apache 服务器取得日志文件,在本案中,我将从 2 apache 服务器取得日志文件。取日志也是每天自动进行一次。有一点必须注意,那就是必须要等“第二步”操作正常结束后再进行取日志;回过头去看“第二步”的“ /usr/local/bin/merge_log.sh 执行时间在 00 05 分,考虑执行程序的开销,估计 1 小时左右可以完成这个操作,所以在凌晨 2 点去取文件是合时的。下面给出取日志的脚本:
# /bin/bash
wget --active-ftp -m --directory-prefix=/root/logs/web1/ --tries=3\ --output-file=/root/script/weblog-get.log\ [url]ftp://sery:[email protected]/sery[/url]*.gz
 
wget --active-ftp -m --directory-prefix=/root/logs/web2/ --tries=3\
--output-file=/root/script/weblog-get.log \
[url]ftp://sery:[/url] [email protected]/sery*.gz
脚本成功运行后,将把第一个 apache 服务器的日志文件放在 ”/root/logs/web 1” 目录,第 2 apache 服务器的日志文件放在 ”/root/logs/web 2” 目录,并且把操作日志记录到文件“ /root/script/weblog-get.log , 以方便检查脚本执行的状况。把这个脚本放在目录 /usr/local/bin 下,命名为 weblog-get.sh, 赋予执行权限,然后手动运行脚本 /usr/local/bin/weblog-get.sh, 看是否取得了远程 apache 服务器的 2 个压缩日志文件。正确无误后,把它加在 crontab 里。
crontab �Ce
00 02 * * * /usr/local/bin/weblog-get.sh
每天凌晨 2 点, awstats 所在的服务器就会主动从 2 个远程的 apache 服务器取来日志文件。
 
二、 日志合并 ( awstats 服务器上进行 )
由于用 ftp 取得的日志文件有多个(本案是 2 个),不便于处理,因此很有必要对日志进行解压和合并。处理使用下面的脚本来完成:
#!/bin/bash
 
#define variables
AwsLogDir=/root/logs/awstats_log
Web1Log=/root/logs/web1
Web1OrigLog=$Web1Log/sery.com-access$(date +%Y%m%d --date='1 days ago').log.gz
Web2Log=/root/logs/web2
Web2OrigLog=$Web1Log/sery.com-access$(date +%Y%m%d --date='1 days ago').log.gz
OldFile=/root/logs/awstats_logs/sery.com-access$(date +%Y%m%d --date='4 days ago').log*
 
#########################################################################
#get logfiles
cd $Web1Log
if [[ -f $Web1OrigLog ]]
then
gunzip  -d $Web1OrigLog
fi
 
FileLog1=sery.com-access$(date +%Y%m%d --date='1 days ago').log
if [[ -f $FileLog1 ]]
then
mv sery.com-access$(date +%Y%m%d --date='1 days ago').log  $AwsLogDir/17k.com-access$(date +%Y%m%d --date='1 days ago').log.1
fi
 
cd $Web2Log
if [[ -f $Web2OrigLog ]]
then
gunzip  -d $Web2OrigLog
fi
 
FileLog2=sery.com-access$(date +%Y%m%d --date='1 days ago').log
if [[ -f $FileLog2 ]]
then
mv sery.com-access$(date +%Y%m%d --date='1 days ago').log  $AwsLogDir/sery.com-access$(date +%Y%m%d --date='1 days ago').log.2
fi
 
#########################################################################
# conbine two web logs to one
cd $AwsLogDir
File1Log=sery.com-access$(date +%Y%m%d --date='1 days ago').log.1
File2Log=sery.com-access$(date +%Y%m%d --date='1 days ago').log.2
 
if [[ -f $File1Log && -f $File2Log ]]
then
  cat $File1Log $File2Log >sery.com-access.log 
fi
 
if [[ -f $OldFile ]]
then
rm $OldFile
fi
上述脚本正常运行后,将在 /root/logs/awstats 目录生成文件 sery.com-access.log, 这个文件正是 awstats 所需要的。如果从更多 apache 服务器取来更多日志文件,上述脚本需要更改才能简洁高效。方法是 用循环方式生成那个 sery.com-access.log 文件。
 
三、 配置 awstats 系统
1、    安装 awstats
(1)    下载 awstats 
wget [url]http://downloads.sourceforge.net/awstats/awstats-6.7.tar.gz?modtime=1183813789&[/url]
big_mirror=0
(2)    解压
tar  xvf  wstats-6.7.tar.gz
mv awstats-6.7  /usr/local/awstats
awstats 需要 apache 协同工作,请自行安装之。 Apache 安装好以后,运行命令 /usr/local/apache/bin/httpd �Cl | grep mod_cgi.c 看是否把模块编译进来,这个模块是必须的。接着再检查 perl 工具是否被安装到系统,如果没有安装,请手动安装。
 
2、  配置 awstats
cd /usr/local/awstats/tools
执行配置脚本,这是一个交互程序,可根据自己的实际情况回答
perl awstats_configure.pl
----- AWStats awstats_configure 1.0 (build 1.7) (c) Laurent Destailleur -----
This tool will help you to configure AWStats to analyze statistics for
one web server. You can try to use it to let it do all that is possible
in AWStats setup, however following the step by step manual setup
documentation (docs/index.html) is often a better idea. Above all if:
- You are not an administrator user,
- You want to analyze downloaded log files without web server,
- You want to analyze mail or ftp log files instead of web log files,
- You need to analyze load balanced servers log files,
- You want to 'understand' all possible ways to use AWStats...
Read the AWStats documentation (docs/index.html).
 
-----> Running OS detected: Linux, BSD or Unix
 
-----> Check for web server install
  Found Web server Apache config file '/usr/local/apache2/conf/httpd.conf'
 
-----> Check and complete web server config file '/usr/local/apache2/conf/httpd.conf'
 
-----> Update model config file '/usr/local/awstats/wwwroot/cgi-bin/awstats.model.conf'
  File awstats.model.conf updated.
 
-----> Need to create a new config file ?
Do you want me to build a new AWStats config/profile
file (required if first install) [y/N] ?
执行完配置后,将生成配置文件 /etc/aswstats/ awstats.sery.conf, 修改
LogFile=/root/logs/awstats_log/17k.com-access.log
然后再执行 perl /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -config=sery.com �Cupdate 如果没有错误的话,在浏览器输入 awstats 服务器的 ip 地址即可得到访问日志报告。我们不想无关的人看见日志报告,用 apache 用户验证功能来完成,把下面的内容加入到 apache 配置文件 httpd.conf 即可:
         A lias /awstatsclasses "/usr/local/awstats/wwwroot/classes/"
Alias /awstatscss "/usr/local/awstats/wwwroot/css/"
Alias /awstatsicons "/usr/local/awstats/wwwroot/icon/"
ScriptAlias /awstats/ "/usr/local/awstats/wwwroot/cgi-bin/"
 
<Directory "/usr/local/awstats/wwwroot/cgi-bin/">
    AuthType Basic
    Options ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
    AuthName "17k awstats Access"
    AuthUserFile /usr/local/awstats/.htpasswd
    Require valid-user
</Directory>
awstats 更新加入 crontab ,让它每天自动执行一次。
crontab �Ce
00 06 * * * /usr/local/bin/awstats_update.sh
脚本 /usr/local/bin/awstats_update 的内容:
#!/bin/bash
perl /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -config=sery.com -update >> /usr/local/awstats/awstats_update.log
每天早上 6 点会自动执行一次更新操作,对日志文件进行处理,最后在浏览器里读出所需数据。
输入正确的用户名和密码
 
 

本文出自 “sery” 博客,转载请与作者联系!

你可能感兴趣的:(apache,日志,职场,awstats,休闲)