Do My Space, Do My Life!
统计分析Web服务器日志
上一篇 / 下一篇 2007-01-08 13:44:38 / 个人分类:我的工作
随着Internet上Web服务的发展,几乎各个政府部门、公司、大专院校、科研院所等都在打算构建或正在建设自己的网站。在这个过程中,大家会遇到各种各样的问题。对Web服务器的运行和访问情况进行详细和周全地分析,可以及时了解网站运行情况,发现网站存在的不足,促进网站更好地发展,它的重要性是不言而喻的。DOIT博客9I4^!M7Vor
DOIT博客Xin5f#G1^
管理Web网站不只是监视Web的速度和Web的内容传送。它不仅要关注服务器每天的吞吐量,还要了解这些Web网站的外来访问,了解网站各页面的访问情况。根据各页面的点击频率来改善网页的内容和质量,提高内容的可读性,以及跟踪包含有商业交易的步骤及管理Web网站“幕后”的数据等。DOIT博客s$sm(f-TG@&S A(p
DOIT博客/f2Vv5H1x
为了更好地提供WWW服务,监控Web服务器的运行情况、了解网站内容的详细访问状况就显得越来越重要和迫切了。而这些要求都可以通过对Web服务器日志文件的统计和分析来实现。本文将对Web服务器日志分析的原理和技术进行讨论。DOIT博客*r"k#F&huf-@ }y:Bp Vg/m
DOIT博客+?}$__mXY']7z
文章内相关工具软件下载地址如下:DOIT博客"j"Qk*|#[3_ @
;bk7ks+j0Webalizer http://www.mrunix.net/webalizer/DOIT博客;GqvQC:n2o'FY
Cronolog http://www.cronolog.org/DOIT博客ps~)Bb-F
Apachehttp://www.apache.org/DOIT博客+gz@1\2UV+e
DOIT博客[9vM`2Y^
Web日志分析的原理
^ kANZ&U/N0DOIT博客 h1L RG2_ \9[6dZ[
网站服务器日志记录了Web服务器接收处理请求及运行时错误等各种原始信息。通过对日志进行统计、分析和综合,就能有效地掌握服务器的运行状况、发现和排除错误原因、了解客户访问分布等,更好地加强系统的维护和管理。
${#u3]#O6ne0DOIT博客!IW;Z/}H5s
WWW服务模型非常简单(见图1):
qy$hl$S0DOIT博客'X8`6P\,ku y} B
图1 Web访问机制DOIT博客+TfN#q9ujc
DOIT博客U(ef u+L2p6`_ w.NN
1.客户端(浏览器)和Web服务器建立TCP连接,连接建立以后,向Web服务器发出访问请求(如get)。根据HTTP协议,该请求中包含了客户端的IP地址、浏览器的类型、请求的URL等一系列信息。
m9H:~ Z5^4R|)YKT0
L~2E:m3O:I+G-f T02. Web服务器收到请求后,将客户端要求的页面内容返回到客户端。如果出现错误,那么返回错误代码。DOIT博客'DGJRQ8@x}%d1R
^},m$mK*f KD!]/]03. 服务器端将访问信息和错误信息记录到日志文件里。
:WC}*[H&[0DOIT博客a8D#in&Eq
下面是客户端发送给Web服务器请求的数据报的内容:
F7o4p(i%pi&Xl0
w} SD2d:R_Lv`/p0GET /engineer/ideal/list.htm HTTP/1.1
b#DX2ry)ex0Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
5UW_;F*{2mtk0application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
4H'JV{2LVj3u0Referer: http://www.linuxaid.com.cn/engineer/ideal/DOIT博客&j3H6?0v&La-v$^
Accept-Language: zh-cn
,xy7n*y9e"K o y0Accept-Encoding: gzip, deflate
2S0~ },L3Ml!`3e0User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
,h8wHc6`"q0Host: www.linuxaid.com.cnDOIT博客z-m3de1lIJtnOd
Connection: Keep-AliveDOIT博客-P sP%K KO]
.D8I~oL+gp0从代码中可以看到,在客户机的请求里包含了很多有用的信息,如客户端类型等。Web服务器会将请求的Web页内容发送返回给客户机。
^5`.{:Dw T]8E0DOIT博客hK%D,bV!r3@\!N
目前常用的Web服务器有Apache、Netscape Enterprise Server、MS IIS等。而现在互联网上常用的Web服务器就是Apache,因此本文所做的讨论都将以Linux+Apache环境讨论(其它的应用环境与此类似)。对于Apache来说,支持多种日志文件格式,最常见的是common和combined两种模式。其中,combined方式比common方式日志信息中的Referer(表示该请求来自于哪里,例如来自于yahoo的搜索引擎)和User-agent(用户客户端类型,如Mozilla或IE)多。下面是common类型的日志示例:
"B)^)NN;W/yy }Y0
{qM#cweo H2w-o0218.242.102.121 - - [06/Dec/2002:00:00:00 +0000] "GETDOIT博客j!Ov-h? T V$q0z
/2/face/shnew/ad/via20020915logo.gif HTTP/1.1" 304 0 "http://www.mpsoft.net/"
*]'ea!\K6}0"Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)"DOIT博客/b|L1`QL
61.139.226.47 - - [06/Dec/2002:00:00:00 +0000] "GET /cgi-bin/guanggaotmp.cgi?1DOIT博客fg3t7TFS
HTTP/1.1" 200 178 "http://www3.beareyes.com.cn/1/index.php" "Mozilla/4.0DOIT博客0B0Vo2G'v@ iL
(compatible; MSIE 5.0; Windows 98; DigExt)"
E4O{!c5QP.Q0218.75.41.11 - - [06/Dec/2002:00:00:00 +0000] "GETDOIT博客U z-J5[%F O]5r
/2/face/shnew/ad/via20020915logo.gif HTTP/1.1" 304 0 "http://www.mpsoft.net/"
oo#u$@ iQW4a _0"Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)"DOIT博客*G6V^%Z9mA@"[
61.187.207.104 - - [06/Dec/2002:00:00:00 +0000] "GET /images/logolun1.gif
8^%kpJ,I~0HTTP/1.1" 304 0 "http://www2.beareyes.com.cn/bbs/b.htm" "Mozilla/4.0 (compatible;
"U9IVVO t sj[%b)i8@U0MSIE 6.0; Windows NT 5.1)"
_)w8bk!eg0211.150.229.228 - - [06/Dec/2002:00:00:00 +0000] "GET /2/face/pub/image_top_l.gifDOIT博客%Mu2T&f;G5Ec\^
HTTP/1.1" 200 260 "http://www.beareyes.com/2/lib/200201/12/20020112004.htm"DOIT博客%K~&G"R N*ho8q s
"Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)"
$MPuo;qH;c3I0
h.As!s1n*a$W?0从上面的日志文件可以看出,日志记录会记录客户端的IP地址、访问发生的时间、访问请求的页面、Web服务器对于该请求返回的状态信息、返回给客户端的内容的大小(以字节为单位)、该请求的引用地址、客户浏览器类型等信息。DOIT博客z1^1nF}6]4c'?S5A*M
+~jY4NmH` GO0Apache日志的配置和管理
W!IJ En.V+b8o0
"}%zbD)BqC!_CN0本文中假设Apache运行有两个虚拟主机:www.secfocus.com和www.tomorrowtel.com。我们需要对这两个虚拟主机分别进行访问日志分析和统计。DOIT博客!mU/LDw6o
6s j,{K+Ez4I+N0Apache配置文件中,需要关心的和日志相关配置有两个:
!mET7Z"C [w0
%z#a3? Oy0$ CustomLog /www/logs/access_log common
['H m!~9V0p0$ ErrorLog /www/logs/error_log
]] ss5ApSZp'I0
0D)J+EE`'~!I-z(q0CustomLog用来指示Apache的访问日志存放的位置(这里保存在/www/logs/access_log中)和格式(这里为common);ErrorLog用来指示Apache错误信息日志存放的位置。
F!SW E!Cp2q7l0DOIT博客w$e I'iE+x
对于不配置虚拟主机的服务器来说,只需直接在httpd.conf中查找CustomLog配置进行修改即可。而对于具有多个虚拟服务器的Web服务器来说,需分离各个虚拟服务器的访问日志,以便对各个虚拟服务器进行访问统计和分析。因此就需要在虚拟服务器配置中进行独立的日志配置,示例如下:
Df:c]H1ZB0DOIT博客G1@y2S$E
NameVirtualHost 75.8.18.19
Y|-rb]!] g0DOIT博客9SU-\x2{tp;r2lB
ServerName www.secfocus.comDOIT博客gNH+aiPs({M.?
ServerAdmin secfocus@secfocus.com
2q1?8I d1N5q)X,f'_0DocumentRoot /www/htdocs/secfocus/DOIT博客u,H/cA,@ei0v
CustomLog "/www/log/secfocus" combined
.[i7GFQ W E"u6o0Alias /usage/ "/www/log/secfocus/usage/"DOIT博客:LYX ]9G,`*BL
2o)nTMJ']0ServerName www.tomorrowtel.comDOIT博客I)Z2lL2L$k.a
ServerAdmin tomorrowtel @ tomorrowtel.comDOIT博客g X5X/rv/gd y n
DocumentRoot /www/htdocs/ tomorrowtelDOIT博客h5T%^rnF Ji
CustomLog "/www/log/tomorrowtel " combined
KA/OK;l[0Alias /usage/ "/www/log/tomorrowtel/usage/"DOIT博客M TvF)m1W;z
DOIT博客2n p)tX:U;^
这里需要注意的是,每个虚拟主机的定义都有一个CustomLog命令,用来指定该虚拟主机访问日志的存放文件;而Alias命令用来让日志分析生成的报表能通过www.secfocus.com/usage/的方式来访问。通过上面的配置就完成了日志文件的保存。DOIT博客Oa W,``2s!_(Of`"g/n
]E*u`Vr0接下来遇到的一个问题就是日志文件的轮循。因为日志一直在增大,如果不进行处理那么日志文件越来越大,就会影响Web服务器运行效率、速率,还可能耗尽服务器硬盘空间,导致服务器无法正常运行。另外,如果单个日志文件大于操作系统单文件尺寸的的限制,从而会进一步影响Web服务的运行。而且,日志文件如果不进行轮循,也不便于日志统计分析程序的运行。因为日志统计分析都是以天为单位进行统计分析的,跨越很长时间日志会使得统计分析程序运行特别慢。因此这里就需要对Web服务器日志文件每天进行轮循。DOIT博客s'o,qt.mG^/lk
DOIT博客E;P.t]Q4nF
Web服务器日志轮循DOIT博客Si%Yc4`2p NJ,D3q%T6X
?j\T9A@F7A0Web服务器日志轮循比较好的方式有三种:第一种方法是利用Linux系统自身的日志文件轮循机制logrotate;第二种方法是利用Apache自带的日志轮循程序rotatelogs;第三种是使用在Apache的FAQ中推荐发展已经比较成熟的一个日志轮循工具 cronolog。
sp8KN"e0DOIT博客[7zLi6PIld!oOs-N!a
对于大型的Web服务来说,往往使用实用负载均衡技术提高Web站点服务能力,这样后台有多个服务器提供Web服务,大大方便了服务的分布规划和扩展性。如果有多个服务器的分布需要对日志进行合并,统一进行统计分析。因此为了保证统计的精确性,需要严格按照每天的时段来自动生成日志。DOIT博客P-@_Bg
DOIT博客G$w8R!A#rG6yp
用logrotate实现日志轮循
(b(C'J R2l/v'i0
8e,sp!K1S!aO6t0首先讨论采用Linux系统自身的日志文件轮循机制logrotate的方法。logrotate是Linux系统自身带的一个日志轮循程序,是专门对各种系统日志(syslogd、mail)进行轮循的程序。该程序是由运行程序的服务crond每天凌晨4:02运行的。在/etc/cron.daily目录下可以看到logrotate文件,其内容如下:
D.e|x&c"C0DOIT博客2GA7C9EC.Z k#A
#!/bin/sh/DOIT博客/XM0?)Vd
$ usr/sbin/logrotate /etc/logrotate.confDOIT博客^#C"F,@X8nJ
?#^O0ekYQ Y0每天清晨crond都会启动/etc/cron.daily目录下的logrotate脚本来进行日志轮循。
i!\pqU.\ Ms#Y0
$JFL;u;G0在/etc/logrorate.conf中可以看到如下内容:
j d Sxj+k/o1p!y t0DOIT博客 \(|t;C&T
# see "man logrotate" for detailsDOIT博客!HI2k7UR{Y]
# rotate log files weekly
]X(aV4ZE^q0weekly
{ C*jV+qrz:E0# keep 4 weeks worth of backlogsDOIT博客1t1IM;f/LA:\,RtA
rotate 4DOIT博客F"Ykg awt
# create new (empty) log files after rotating old onesDOIT博客U2R$W f{%`D"b
createDOIT博客F$w`+wG%i R$Nx*~
# uncomment this if you want your log files compressed
(]m+Rs(?;N&T_ANk0#compressDOIT博客:mw7W-^ r.f)L^_N
# RPM packages drop log rotation information into this directoryDOIT博客^w6Q wn4k:W
include /etc/logrotate.d
,gk~FV2F)t!Pt7q{4ew0# no packages own wtmp -- we'll rotate them hereDOIT博客Au5`5OH,M^
/var/log/wtmp {
#|XI:MCQ0monthlyDOIT博客4J,{5JZ1U drUU
create 0664 root utmpDOIT博客5yJLAz'F
rotate 1DOIT博客 Kl | Y,r3HYek
}
w$E`f7dz?1p0# system-specific logs may be also be configured here.
|;_&Xkk&D0DOIT博客7fc/\%}b#IPUIe
从 logrotate的配置文件中可以看到,除了wtmp以外,需要滚动的日志的配置都保存在/etc/logroate.d目录下。因此只需要在该目录下创建一个名为apache的配置文件,来指示logrotate如何轮循Web服务器的日志文件即可。下面是一个示例:DOIT博客2e}/Ybu.{8u0v
DOIT博客9} f6Tv[:Q&e)g
/www/log/secfocus {DOIT博客WIY2nz!wCC [
rotate 2DOIT博客 AXO6w7XH7P
dailyDOIT博客f5K,`8@#V R!KK.b6t-h
missingokDOIT博客/` w@ d4o*\]
sharedscrīpts
-C@,eTb/IX*xo0postrotate
aM"N(O_l0/usr/bin/killall -HUP httpd 2> /dev/null || true
$h!M@'u%B#lQ$N0endscrīpt
ry#jjarOwA0}
ib#q^#K,|pL&L0/www/log/tomorrowtel {
fX gmEH0rotate 2
4Y9c5?S7D8|0dailyDOIT博客2wE(?EMfTTUlk
missingokDOIT博客 jHb%N:z*~
sharedscrīptsDOIT博客_qW C9wo,G
postrotate
3`Ex;dQTO0/usr/bin/killall -HUP httpd 2> /dev/null || true
&Ic.GC9K'TNI0endscrīpt
CrX _t U0}DOIT博客7iv&Yy8Y? m
DOIT博客$i#H j+S`N
这里“rotate 2”表示轮循时只包括两个备份文件,也就是只有access_log、access_log.1和access_log.2三个日志备份文件。这样就实现了对两个虚拟主机的日志文件的轮循。本文后面会讨论如何使用日志统计分析软件对日志文件进行处理。
#@ tddS y~0DOIT博客x?#dlV`8W'p)~
这种方法的优点是不需要其它第三方工具就可以实现日志轮循。但是对于重负载的服务器和使用负载均衡技术的Web服务器来说,这种方法不是很实用。因为它是对相应服务进程发出一个-HUP重启命令来实现日志的截断归档的,这样会影响服务的连续性。DOIT博客l/X u9`lc([x4T"K
ZV!al2uRI%E`H0用rotatelogs实现日志轮循DOIT博客-Mqb#Qo5{9s
DOIT博客vP"R@9O:b[ G gYI
Apache 提供了不把日志直接写入文件,而是通过管道发送给另外一个程序的能力。这样就大大加强了对日志进行处理的能力。这个通过管道得到的程序可以是任何程序,如日志分析、压缩日志等。要实现将日志写到管道的操作,只需要将配置中日志文件部分的内容替换为“|程序名”即可,例如:
|pmx8]js+h6E"Q(b0DOIT博客 oc*k3Xx&?6~-f5N
# compressed logsDOIT博客7s,_sI3@ \S+Hr
$ CustomLog "|/usr/bin/gzip -c >> /var/log/access_log.gz" commonDOIT博客pLW(a8]5l-E
DOIT博客m5P#t'@;~p
这样就可以使用Apache自带的轮循工具rotatelogs来对日志文件进行轮循。rotatelogs基本是按时间或大小来控制日志的。
J}}7j d-tZ0DOIT博客!Ik6C~P:S*F
$ CustomLog "|/www/bin/rotatelogs /www/logs/secfocus/access_log 86400" commonDOIT博客SlTnh0dP
DOIT博客s@nhQtV
上面的示例中,Apache访问日志被发送给程序rotatelogs;rotatelogs将日志写入 /www/logs/secfocus/access_log,并每隔86400秒(1天)对日志进行一次轮循。轮循以后的文件名为 /www/logs/secfocus/access_log.nnn,这里nnn是开始记录日志的时间。因此,为了将日志按天对齐需要在凌晨00:00 启动服务,使得每天轮循得到的日志刚好是完整一天的日志,以提供给访问统计分析程序进行处理。如果是00:00开始生成新的日志,那么轮循得到的日志就是 access_log.0000。DOIT博客ke-A1}g'["_^
DOIT博客Q\Y8Zo-Y"h w0N
用cronolog实现日志轮循
rebS p ajr0
%k"Y4sE)EcA e/nW0首先需要下载和安装cronolog,可以到http://www.cronolog.org下载最新版本的cronolog。下载完毕以后,解压安装即可。方法如下所示:
7O X\j"gIp g4\0DOIT博客8x&h/Gd7m7k
tar xvfz cronolog-1.6.2.tar.gzDOIT博客6F\TNJb,s
cd cronolog-1.6.2
J-Min;P0I0./configureDOIT博客_%FxSn-m:A
make
o`5J b*y@P0make checkDOIT博客ov$~6X8r
make installDOIT博客Z!Jah-^~k
$mq$|/d6{;I!o0这样就完成了cronolog的配置和安装,默认情况下cronolog是安装在/usr/local/sbin下。DOIT博客*GG g%~X9P\
*??"nF2q?:U'w;E%bY0修改Apache日志配置命令如下所示:DOIT博客*}1mk"Uv{P'qD
DOIT博客c7Mf%fW`Lm
$ CustomLog "|/usr/local/sbin/cronolog /www/logs/secfocus/%w/access_log" combinedDOIT博客.FF7D M n7J7xW4l
e@ J/UW8R0这里%w表示按照日期在不同的目录下保存日志,这种方式会保存一周的日志。
VV/\^"A vqw0
Fh f/ZA3SQ0为了进行日志分析,需要每天将该日志文件拷贝(或移动,如果不希望保存一周的日志)到一个固定的位置,以方便日志分析统计文件进行处理(使用crontab -e)。添加定时任务如下:DOIT博客 kz%xg]w5R&I
fC!o:iXcz(F0$ 5 0 * * * /bin/mv /www/logs/secfocus/`date -v-1d +\%w`/access_log
-[7P!zDY7BG0/www/logs/secfocus/access_log_yesterday
4q*S lgAV"B0
MTv]6g/N0再使用日志统计分析程序,对文件access_log_yesterday进行处理。DOIT博客9?3b/lIj2`
DOIT博客L_1],K1Z iTR@:k
对于使用负载均衡技术的大型站点,就存在多个服务器的访问日志的合并处理问题。对于这种情况,各个服务器定义或移动日志文件时就不能使用 access_log_yesterday了,而应该带上服务器编号(例如服务器IP地址等信息)加以区分。然后在各个服务器上运行网站镜像和备份服务 rsyncd,再将每个服务器每天的安装配置文件通过rsync下载到专门进行访问统计分析的服务器上进行合并。
ns S#i^s*e){0DOIT博客7[*l3{w2Z kJ
合并多个服务器的日志文件(如log1、log2、log3),并输出到log_all中的方法是:
X-tE#f k}0DOIT博客YZ:k tK]@
$ sort -m -t " " -k 4 -o log_all log1 log2 log3
r"wd3hZ2w:N*i&O(rH!\0
8i[M;y0MNk)D0-m表示使用merge优化算法;-k 4表示根据时间进行排序;-o表示将排序结果存放到指定的文件中。
s(?#bV Sm#y"q2~5`0
OKz B}$kbL0Q0日志统计分析程序webalizer的安装和配置DOIT博客 z O+n:F5i.h(@*k&h1p
G)q`Ci8Q ~8wM0webalizer是一个高效、免费的Web服务器日志分析程序。其分析结果是HTML文件格式的,从而可以很方便地通过Web服务器进行浏览。Internet上的很多站点都使用webalizer进行Web服务器日志分析。Webalizer具有以下一些特性。
j~8T8y)]&\ v&C
DOIT博客Xin5f#G1^
管理Web网站不只是监视Web的速度和Web的内容传送。它不仅要关注服务器每天的吞吐量,还要了解这些Web网站的外来访问,了解网站各页面的访问情况。根据各页面的点击频率来改善网页的内容和质量,提高内容的可读性,以及跟踪包含有商业交易的步骤及管理Web网站“幕后”的数据等。DOIT博客s$sm(f-TG@&S A(p
DOIT博客/f2Vv5H1x
为了更好地提供WWW服务,监控Web服务器的运行情况、了解网站内容的详细访问状况就显得越来越重要和迫切了。而这些要求都可以通过对Web服务器日志文件的统计和分析来实现。本文将对Web服务器日志分析的原理和技术进行讨论。DOIT博客*r"k#F&huf-@ }y:Bp Vg/m
DOIT博客+?}$__mXY']7z
文章内相关工具软件下载地址如下:DOIT博客"j"Qk*|#[3_ @
;bk7ks+j0Webalizer http://www.mrunix.net/webalizer/DOIT博客;GqvQC:n2o'FY
Cronolog http://www.cronolog.org/DOIT博客ps~)Bb-F
Apachehttp://www.apache.org/DOIT博客+gz@1\2UV+e
DOIT博客[9vM`2Y^
Web日志分析的原理
^ kANZ&U/N0DOIT博客 h1L RG2_ \9[6dZ[
网站服务器日志记录了Web服务器接收处理请求及运行时错误等各种原始信息。通过对日志进行统计、分析和综合,就能有效地掌握服务器的运行状况、发现和排除错误原因、了解客户访问分布等,更好地加强系统的维护和管理。
${#u3]#O6ne0DOIT博客!IW;Z/}H5s
WWW服务模型非常简单(见图1):
qy$hl$S0DOIT博客'X8`6P\,ku y} B
图1 Web访问机制DOIT博客+TfN#q9ujc
DOIT博客U(ef u+L2p6`_ w.NN
1.客户端(浏览器)和Web服务器建立TCP连接,连接建立以后,向Web服务器发出访问请求(如get)。根据HTTP协议,该请求中包含了客户端的IP地址、浏览器的类型、请求的URL等一系列信息。
m9H:~ Z5^4R|)YKT0
L~2E:m3O:I+G-f T02. Web服务器收到请求后,将客户端要求的页面内容返回到客户端。如果出现错误,那么返回错误代码。DOIT博客'DGJRQ8@x}%d1R
^},m$mK*f KD!]/]03. 服务器端将访问信息和错误信息记录到日志文件里。
:WC}*[H&[0DOIT博客a8D#in&Eq
下面是客户端发送给Web服务器请求的数据报的内容:
F7o4p(i%pi&Xl0
w} SD2d:R_Lv`/p0GET /engineer/ideal/list.htm HTTP/1.1
b#DX2ry)ex0Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
5UW_;F*{2mtk0application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
4H'JV{2LVj3u0Referer: http://www.linuxaid.com.cn/engineer/ideal/DOIT博客&j3H6?0v&La-v$^
Accept-Language: zh-cn
,xy7n*y9e"K o y0Accept-Encoding: gzip, deflate
2S0~ },L3Ml!`3e0User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
,h8wHc6`"q0Host: www.linuxaid.com.cnDOIT博客z-m3de1lIJtnOd
Connection: Keep-AliveDOIT博客-P sP%K KO]
.D8I~oL+gp0从代码中可以看到,在客户机的请求里包含了很多有用的信息,如客户端类型等。Web服务器会将请求的Web页内容发送返回给客户机。
^5`.{:Dw T]8E0DOIT博客hK%D,bV!r3@\!N
目前常用的Web服务器有Apache、Netscape Enterprise Server、MS IIS等。而现在互联网上常用的Web服务器就是Apache,因此本文所做的讨论都将以Linux+Apache环境讨论(其它的应用环境与此类似)。对于Apache来说,支持多种日志文件格式,最常见的是common和combined两种模式。其中,combined方式比common方式日志信息中的Referer(表示该请求来自于哪里,例如来自于yahoo的搜索引擎)和User-agent(用户客户端类型,如Mozilla或IE)多。下面是common类型的日志示例:
"B)^)NN;W/yy }Y0
{qM#cweo H2w-o0218.242.102.121 - - [06/Dec/2002:00:00:00 +0000] "GETDOIT博客j!Ov-h? T V$q0z
/2/face/shnew/ad/via20020915logo.gif HTTP/1.1" 304 0 "http://www.mpsoft.net/"
*]'ea!\K6}0"Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)"DOIT博客/b|L1`QL
61.139.226.47 - - [06/Dec/2002:00:00:00 +0000] "GET /cgi-bin/guanggaotmp.cgi?1DOIT博客fg3t7TFS
HTTP/1.1" 200 178 "http://www3.beareyes.com.cn/1/index.php" "Mozilla/4.0DOIT博客0B0Vo2G'v@ iL
(compatible; MSIE 5.0; Windows 98; DigExt)"
E4O{!c5QP.Q0218.75.41.11 - - [06/Dec/2002:00:00:00 +0000] "GETDOIT博客U z-J5[%F O]5r
/2/face/shnew/ad/via20020915logo.gif HTTP/1.1" 304 0 "http://www.mpsoft.net/"
oo#u$@ iQW4a _0"Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)"DOIT博客*G6V^%Z9mA@"[
61.187.207.104 - - [06/Dec/2002:00:00:00 +0000] "GET /images/logolun1.gif
8^%kpJ,I~0HTTP/1.1" 304 0 "http://www2.beareyes.com.cn/bbs/b.htm" "Mozilla/4.0 (compatible;
"U9IVVO t sj[%b)i8@U0MSIE 6.0; Windows NT 5.1)"
_)w8bk!eg0211.150.229.228 - - [06/Dec/2002:00:00:00 +0000] "GET /2/face/pub/image_top_l.gifDOIT博客%Mu2T&f;G5Ec\^
HTTP/1.1" 200 260 "http://www.beareyes.com/2/lib/200201/12/20020112004.htm"DOIT博客%K~&G"R N*ho8q s
"Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)"
$MPuo;qH;c3I0
h.As!s1n*a$W?0从上面的日志文件可以看出,日志记录会记录客户端的IP地址、访问发生的时间、访问请求的页面、Web服务器对于该请求返回的状态信息、返回给客户端的内容的大小(以字节为单位)、该请求的引用地址、客户浏览器类型等信息。DOIT博客z1^1nF}6]4c'?S5A*M
+~jY4NmH` GO0Apache日志的配置和管理
W!IJ En.V+b8o0
"}%zbD)BqC!_CN0本文中假设Apache运行有两个虚拟主机:www.secfocus.com和www.tomorrowtel.com。我们需要对这两个虚拟主机分别进行访问日志分析和统计。DOIT博客!mU/LDw6o
6s j,{K+Ez4I+N0Apache配置文件中,需要关心的和日志相关配置有两个:
!mET7Z"C [w0
%z#a3? Oy0$ CustomLog /www/logs/access_log common
['H m!~9V0p0$ ErrorLog /www/logs/error_log
]] ss5ApSZp'I0
0D)J+EE`'~!I-z(q0CustomLog用来指示Apache的访问日志存放的位置(这里保存在/www/logs/access_log中)和格式(这里为common);ErrorLog用来指示Apache错误信息日志存放的位置。
F!SW E!Cp2q7l0DOIT博客w$e I'iE+x
对于不配置虚拟主机的服务器来说,只需直接在httpd.conf中查找CustomLog配置进行修改即可。而对于具有多个虚拟服务器的Web服务器来说,需分离各个虚拟服务器的访问日志,以便对各个虚拟服务器进行访问统计和分析。因此就需要在虚拟服务器配置中进行独立的日志配置,示例如下:
Df:c]H1ZB0DOIT博客G1@y2S$E
NameVirtualHost 75.8.18.19
Y|-rb]!] g0DOIT博客9SU-\x2{tp;r2lB
ServerName www.secfocus.comDOIT博客gNH+aiPs({M.?
ServerAdmin secfocus@secfocus.com
2q1?8I d1N5q)X,f'_0DocumentRoot /www/htdocs/secfocus/DOIT博客u,H/cA,@ei0v
CustomLog "/www/log/secfocus" combined
.[i7GFQ W E"u6o0Alias /usage/ "/www/log/secfocus/usage/"DOIT博客:LYX ]9G,`*BL
2o)nTMJ']0ServerName www.tomorrowtel.comDOIT博客I)Z2lL2L$k.a
ServerAdmin tomorrowtel @ tomorrowtel.comDOIT博客g X5X/rv/gd y n
DocumentRoot /www/htdocs/ tomorrowtelDOIT博客h5T%^rnF Ji
CustomLog "/www/log/tomorrowtel " combined
KA/OK;l[0Alias /usage/ "/www/log/tomorrowtel/usage/"DOIT博客M TvF)m1W;z
DOIT博客2n p)tX:U;^
这里需要注意的是,每个虚拟主机的定义都有一个CustomLog命令,用来指定该虚拟主机访问日志的存放文件;而Alias命令用来让日志分析生成的报表能通过www.secfocus.com/usage/的方式来访问。通过上面的配置就完成了日志文件的保存。DOIT博客Oa W,``2s!_(Of`"g/n
]E*u`Vr0接下来遇到的一个问题就是日志文件的轮循。因为日志一直在增大,如果不进行处理那么日志文件越来越大,就会影响Web服务器运行效率、速率,还可能耗尽服务器硬盘空间,导致服务器无法正常运行。另外,如果单个日志文件大于操作系统单文件尺寸的的限制,从而会进一步影响Web服务的运行。而且,日志文件如果不进行轮循,也不便于日志统计分析程序的运行。因为日志统计分析都是以天为单位进行统计分析的,跨越很长时间日志会使得统计分析程序运行特别慢。因此这里就需要对Web服务器日志文件每天进行轮循。DOIT博客s'o,qt.mG^/lk
DOIT博客E;P.t]Q4nF
Web服务器日志轮循DOIT博客Si%Yc4`2p NJ,D3q%T6X
?j\T9A@F7A0Web服务器日志轮循比较好的方式有三种:第一种方法是利用Linux系统自身的日志文件轮循机制logrotate;第二种方法是利用Apache自带的日志轮循程序rotatelogs;第三种是使用在Apache的FAQ中推荐发展已经比较成熟的一个日志轮循工具 cronolog。
sp8KN"e0DOIT博客[7zLi6PIld!oOs-N!a
对于大型的Web服务来说,往往使用实用负载均衡技术提高Web站点服务能力,这样后台有多个服务器提供Web服务,大大方便了服务的分布规划和扩展性。如果有多个服务器的分布需要对日志进行合并,统一进行统计分析。因此为了保证统计的精确性,需要严格按照每天的时段来自动生成日志。DOIT博客P-@_Bg
DOIT博客G$w8R!A#rG6yp
用logrotate实现日志轮循
(b(C'J R2l/v'i0
8e,sp!K1S!aO6t0首先讨论采用Linux系统自身的日志文件轮循机制logrotate的方法。logrotate是Linux系统自身带的一个日志轮循程序,是专门对各种系统日志(syslogd、mail)进行轮循的程序。该程序是由运行程序的服务crond每天凌晨4:02运行的。在/etc/cron.daily目录下可以看到logrotate文件,其内容如下:
D.e|x&c"C0DOIT博客2GA7C9EC.Z k#A
#!/bin/sh/DOIT博客/XM0?)Vd
$ usr/sbin/logrotate /etc/logrotate.confDOIT博客^#C"F,@X8nJ
?#^O0ekYQ Y0每天清晨crond都会启动/etc/cron.daily目录下的logrotate脚本来进行日志轮循。
i!\pqU.\ Ms#Y0
$JFL;u;G0在/etc/logrorate.conf中可以看到如下内容:
j d Sxj+k/o1p!y t0DOIT博客 \(|t;C&T
# see "man logrotate" for detailsDOIT博客!HI2k7UR{Y]
# rotate log files weekly
]X(aV4ZE^q0weekly
{ C*jV+qrz:E0# keep 4 weeks worth of backlogsDOIT博客1t1IM;f/LA:\,RtA
rotate 4DOIT博客F"Ykg awt
# create new (empty) log files after rotating old onesDOIT博客U2R$W f{%`D"b
createDOIT博客F$w`+wG%i R$Nx*~
# uncomment this if you want your log files compressed
(]m+Rs(?;N&T_ANk0#compressDOIT博客:mw7W-^ r.f)L^_N
# RPM packages drop log rotation information into this directoryDOIT博客^w6Q wn4k:W
include /etc/logrotate.d
,gk~FV2F)t!Pt7q{4ew0# no packages own wtmp -- we'll rotate them hereDOIT博客Au5`5OH,M^
/var/log/wtmp {
#|XI:MCQ0monthlyDOIT博客4J,{5JZ1U drUU
create 0664 root utmpDOIT博客5yJLAz'F
rotate 1DOIT博客 Kl | Y,r3HYek
}
w$E`f7dz?1p0# system-specific logs may be also be configured here.
|;_&Xkk&D0DOIT博客7fc/\%}b#IPUIe
从 logrotate的配置文件中可以看到,除了wtmp以外,需要滚动的日志的配置都保存在/etc/logroate.d目录下。因此只需要在该目录下创建一个名为apache的配置文件,来指示logrotate如何轮循Web服务器的日志文件即可。下面是一个示例:DOIT博客2e}/Ybu.{8u0v
DOIT博客9} f6Tv[:Q&e)g
/www/log/secfocus {DOIT博客WIY2nz!wCC [
rotate 2DOIT博客 AXO6w7XH7P
dailyDOIT博客f5K,`8@#V R!KK.b6t-h
missingokDOIT博客/` w@ d4o*\]
sharedscrīpts
-C@,eTb/IX*xo0postrotate
aM"N(O_l0/usr/bin/killall -HUP httpd 2> /dev/null || true
$h!M@'u%B#lQ$N0endscrīpt
ry#jjarOwA0}
ib#q^#K,|pL&L0/www/log/tomorrowtel {
fX gmEH0rotate 2
4Y9c5?S7D8|0dailyDOIT博客2wE(?EMfTTUlk
missingokDOIT博客 jHb%N:z*~
sharedscrīptsDOIT博客_qW C9wo,G
postrotate
3`Ex;dQTO0/usr/bin/killall -HUP httpd 2> /dev/null || true
&Ic.GC9K'TNI0endscrīpt
CrX _t U0}DOIT博客7iv&Yy8Y? m
DOIT博客$i#H j+S`N
这里“rotate 2”表示轮循时只包括两个备份文件,也就是只有access_log、access_log.1和access_log.2三个日志备份文件。这样就实现了对两个虚拟主机的日志文件的轮循。本文后面会讨论如何使用日志统计分析软件对日志文件进行处理。
#@ tddS y~0DOIT博客x?#dlV`8W'p)~
这种方法的优点是不需要其它第三方工具就可以实现日志轮循。但是对于重负载的服务器和使用负载均衡技术的Web服务器来说,这种方法不是很实用。因为它是对相应服务进程发出一个-HUP重启命令来实现日志的截断归档的,这样会影响服务的连续性。DOIT博客l/X u9`lc([x4T"K
ZV!al2uRI%E`H0用rotatelogs实现日志轮循DOIT博客-Mqb#Qo5{9s
DOIT博客vP"R@9O:b[ G gYI
Apache 提供了不把日志直接写入文件,而是通过管道发送给另外一个程序的能力。这样就大大加强了对日志进行处理的能力。这个通过管道得到的程序可以是任何程序,如日志分析、压缩日志等。要实现将日志写到管道的操作,只需要将配置中日志文件部分的内容替换为“|程序名”即可,例如:
|pmx8]js+h6E"Q(b0DOIT博客 oc*k3Xx&?6~-f5N
# compressed logsDOIT博客7s,_sI3@ \S+Hr
$ CustomLog "|/usr/bin/gzip -c >> /var/log/access_log.gz" commonDOIT博客pLW(a8]5l-E
DOIT博客m5P#t'@;~p
这样就可以使用Apache自带的轮循工具rotatelogs来对日志文件进行轮循。rotatelogs基本是按时间或大小来控制日志的。
J}}7j d-tZ0DOIT博客!Ik6C~P:S*F
$ CustomLog "|/www/bin/rotatelogs /www/logs/secfocus/access_log 86400" commonDOIT博客SlTnh0dP
DOIT博客s@nhQtV
上面的示例中,Apache访问日志被发送给程序rotatelogs;rotatelogs将日志写入 /www/logs/secfocus/access_log,并每隔86400秒(1天)对日志进行一次轮循。轮循以后的文件名为 /www/logs/secfocus/access_log.nnn,这里nnn是开始记录日志的时间。因此,为了将日志按天对齐需要在凌晨00:00 启动服务,使得每天轮循得到的日志刚好是完整一天的日志,以提供给访问统计分析程序进行处理。如果是00:00开始生成新的日志,那么轮循得到的日志就是 access_log.0000。DOIT博客ke-A1}g'["_^
DOIT博客Q\Y8Zo-Y"h w0N
用cronolog实现日志轮循
rebS p ajr0
%k"Y4sE)EcA e/nW0首先需要下载和安装cronolog,可以到http://www.cronolog.org下载最新版本的cronolog。下载完毕以后,解压安装即可。方法如下所示:
7O X\j"gIp g4\0DOIT博客8x&h/Gd7m7k
tar xvfz cronolog-1.6.2.tar.gzDOIT博客6F\TNJb,s
cd cronolog-1.6.2
J-Min;P0I0./configureDOIT博客_%FxSn-m:A
make
o`5J b*y@P0make checkDOIT博客ov$~6X8r
make installDOIT博客Z!Jah-^~k
$mq$|/d6{;I!o0这样就完成了cronolog的配置和安装,默认情况下cronolog是安装在/usr/local/sbin下。DOIT博客*GG g%~X9P\
*??"nF2q?:U'w;E%bY0修改Apache日志配置命令如下所示:DOIT博客*}1mk"Uv{P'qD
DOIT博客c7Mf%fW`Lm
$ CustomLog "|/usr/local/sbin/cronolog /www/logs/secfocus/%w/access_log" combinedDOIT博客.FF7D M n7J7xW4l
e@ J/UW8R0这里%w表示按照日期在不同的目录下保存日志,这种方式会保存一周的日志。
VV/\^"A vqw0
Fh f/ZA3SQ0为了进行日志分析,需要每天将该日志文件拷贝(或移动,如果不希望保存一周的日志)到一个固定的位置,以方便日志分析统计文件进行处理(使用crontab -e)。添加定时任务如下:DOIT博客 kz%xg]w5R&I
fC!o:iXcz(F0$ 5 0 * * * /bin/mv /www/logs/secfocus/`date -v-1d +\%w`/access_log
-[7P!zDY7BG0/www/logs/secfocus/access_log_yesterday
4q*S lgAV"B0
MTv]6g/N0再使用日志统计分析程序,对文件access_log_yesterday进行处理。DOIT博客9?3b/lIj2`
DOIT博客L_1],K1Z iTR@:k
对于使用负载均衡技术的大型站点,就存在多个服务器的访问日志的合并处理问题。对于这种情况,各个服务器定义或移动日志文件时就不能使用 access_log_yesterday了,而应该带上服务器编号(例如服务器IP地址等信息)加以区分。然后在各个服务器上运行网站镜像和备份服务 rsyncd,再将每个服务器每天的安装配置文件通过rsync下载到专门进行访问统计分析的服务器上进行合并。
ns S#i^s*e){0DOIT博客7[*l3{w2Z kJ
合并多个服务器的日志文件(如log1、log2、log3),并输出到log_all中的方法是:
X-tE#f k}0DOIT博客YZ:k tK]@
$ sort -m -t " " -k 4 -o log_all log1 log2 log3
r"wd3hZ2w:N*i&O(rH!\0
8i[M;y0MNk)D0-m表示使用merge优化算法;-k 4表示根据时间进行排序;-o表示将排序结果存放到指定的文件中。
s(?#bV Sm#y"q2~5`0
OKz B}$kbL0Q0日志统计分析程序webalizer的安装和配置DOIT博客 z O+n:F5i.h(@*k&h1p
G)q`Ci8Q ~8wM0webalizer是一个高效、免费的Web服务器日志分析程序。其分析结果是HTML文件格式的,从而可以很方便地通过Web服务器进行浏览。Internet上的很多站点都使用webalizer进行Web服务器日志分析。Webalizer具有以下一些特性。
j~8T8y)]&\ v&C