web服务器日志配置和分析详解.docx
《web服务器日志配置和分析详解.docx》由会员分享,可在线阅读,更多相关《web服务器日志配置和分析详解.docx(20页珍藏版)》请在冰豆网上搜索。
web服务器日志配置和分析详解
Web服务器日志配置和分析详解
从某种程度上将”日志就是金钱”,因为通过日志能够分析出一个网站具有高流量,则广告商愿意为其支付费用。
对于所有的公司或ICP来说,除了要保证网站稳定正常的运行以外,一个重要的问题就是网站访问量的统计和分析报表,这对于了解和监控网站的运行状态,提高各个网站的服务能力和服务水平是必不可少的。
而这些要求都可以通过对Web服务器日志文件的统计和分析来实现。
1.web日志分析原理
web服务器日志记录了Web服务器接收处理请求及运行时错误等各种原始信息。
通过对日志进行统计、分析和综合,就能有效地掌握服务器的运行状况、发现和排除错误原因、了解客户访问分布等,更好地加强系统的维护和管理。
Web服务模式主要有三个步骤:
服务请求,包含用户端的众多基本信息,如IP地址、浏览器类型、目标URL等。
服务响应,Web服务器接收到请求后,按照用户要求运行相应的功能,并将信息返回给用户。
如果出现错误,将返回错误代码。
追加日志,服务器将对用户访问过程中的相关信息以追加的方式保存到日志文件中。
如图1:
2.Apache日志的配置
2.1.日志类型
1.3版本Apache的标准中规定了4类日志:
错误日志、访问日志、传输日志、Cookie日志
其中:
传输日志和Cookie日志被Apache2.0认为已经过时。
所以本文仅讨论错误日志和访问日志。
同时错误日志和访问日志被Apache2.0默认设置。
错误日志包含:
获知失效链接、获知CGI错误、获知用户认证错误
访问日志包含:
Ø访问服务器的远程机器的地址:
可以得知浏览者来自何方
Ø浏览者访问的资源:
可以得知网站中的哪些部分最受欢迎
Ø浏览者的浏览时间:
可以从浏览时间(如工作时间或休闲时间)对网站内容进行调整
Ø浏览者使用的浏览器:
可以根据大多数浏览者使用的浏览器对站点进行优化
访问日志分类:
为了便于分析Apache的访问日志,Apache的默认配置文件中,按记录的信息不同(用不同格式昵称说明不同的信息)将访问日志分为4类:
1)普通日志格式(commonlogformat,CLF)common 大多数日志分析软件都支持这种格式
2)参考日志格式(refererlogformat)referrer 记录客户访问站点的用户身份
3)代理日志格式(agentlogformat)agent 记录请求的用户代理
4)综合日志格式(combinedlogformat)combined 结合以上三种日志信息
2.2.配置访问日志命令
CustomLog命令用来对服务器的请求进行日志记录。
格式为:
格式1:
CustomLog访问日志文件名记录格式说明串|格式昵称
格式2:
CustomLog"|管道程序名访问日志文件名"记录格式说明串|格式昵称
说明:
访问日志文件名:
除非文件位置用”/“开头,否则所制定的文件位置是相对于ServerRoot目录的相对路径
格式昵称:
使用LogFormat命令将一个记录格式说明串赋以一个名称
记录格式说明串:
用字符串和格式说明符(以%开头)指定日志记录的内容
管道程序名:
管道符”|”后面紧跟着一个程序的路径,这个程序把日志从标准输入设备中读入并处理。
LogFormat命令用于定义访问日志的记录格式。
格式为:
LogFormat"记录格式说明串"格式昵称
从apache2.conf中可知,在Apache中定义了下面的4种类型的访问日志:
LogFormat"%h%l%u%t\"%r\"%>s%b\"%{Referer}i\"\"%{User-Agent}i\""combined
LogFormat"%h%l%u%t\"%r\"%>s%b"common
LogFormat"%{Referer}i->%U"referer
LogFormat"%{User-agent}i"agent
由于综合日志格式简单地结合了3种日志信息,所以在配置访问日志时,要么使用一个综合文件进行记录,要么使用分离的多个(1-3)文件记录。
通常使用一个综合日志格式文件进行记录,配置为:
CustomLog/var/log/apache2/access.logcombined
若使用3个文件分别进行记录,配置为:
CustomLog/var/log/apache2/access.logcommon
CustomLog/var/log/apache2/referer.logreferer
CustomLog/var/log/apache2/agent.logagent
下面的命令组:
LogFormat"%h%l%u%t\"%r\"%>s%b"common
CustomLoglogs/access_logcommon
与下面的命令等效:
CustomLoglogs/access_log"%h%l%u%t\"%r\"%>s%b"
通常我们配置访问日志时,使用先使用LogFormat命令定义格式昵称,然后再在CustomLog命令中引用昵称的方法。
在使用LogFormat和CustomLog命令中为了说明要记录的日志内容,可以使用的常用格式说明符如表-3。
格式说明符
说明
%v
进行服务的服务器的标准名字ServerName,通常用于虚拟主机的日志记录中。
%h
客户机的IP地址。
%l
从identd服务器中获取远程登录名称,基本已废弃。
%u
来自于认证的远程用户。
%t
连接的日期和时间。
%r
HTTP请求的首行信息,典型格式是“METHODRESOURCEPROTOCOL”,即“方法资源协议”。
经常可能出现的METHOD是GET、POST和HEAD;RESOURCE是指浏览者向服务器请求的文档或URL;PROTOCOL通常是HTTP,后面再加上版本号,通常是HTTP/1.1。
%>s
响应请求的状态代码,一般这项的值是200,表示服务器已经成功地响应浏览器的请求,一切正常;以3开头的状态代码表示由于各种不同的原因用户请求被重定向到了其他位置;以4开头的状态代码表示客户端存在某种错误;以5开头的状态代码表示服务器遇到了某个错误。
%b
传送的字节数(不包含HTTP头信息),将日志记录中的这些值加起来就可以得知服务器在一天、一周或者一月内发送了多少数据。
%{Referer}i
指明了该请求是从被哪个网页提交过来的。
%U
请求的URL路径,不包含查询串。
\"%{User-Agent}i\"
此项是客户浏览器提供的浏览器识别信息。
图2是从一个访问日志文件中截取的几条记录。
这里使用winscp远程登录到Solaris10服务器的日志文件目录:
将其中一列各项信息分离于表-4所示:
格式说明符
举例1
%h
远程主机IP
192.168.220.1
%l
-(表示没有取得信息)
%u
-
%t
访问日期,时间和时差
14/Oct/2008:
19:
54:
51+0800
%r
请求/版本
"GET/HTTP/1.1"
%>s
服务状态码
404
%b
发送的字节数
1185
%{Referer}i
”-”
%{User-Agent}i
3、配置错误日志
错误日志记录了服务器运行期间遇到的各种错误,以及一些普通的诊断信息,比如服务器何时启动、何时关闭等。
ErrorLog命令指定了当服务器遇到错误时记录错误日志的文件名。
其格式为:
格式1:
ErrorLog错误日志文件名
格式2:
ErrorLog"|管道程序名"
格式1直接指定错误日志文件名,除非文件位置用”/“开头,否则ErrorLog所制定的文件位置是相对于ServerRoot目录的相对路径。
格式2实现管道日志,它指定一个命令来处理错误日志。
Apache编译时默认的错误日志可以使用如下命令获得:
$apache2-V|grepDEFAULT_ERRORLOG
-DDEFAULT_ERRORLOG="logs/error_log"
LogLevel
LogLevel用于调整记于错误日志中的信息的详细程度。
等级
应用说明
级别
emerg
出现紧急情况使得该系统不可用,如系统宕机等
1
alert
需要立即引起注意的情况
2
crit
危险情况的警告
3
error
除了emerg、alert、crit的其他错误
4
warn
警告信息
5
notice
需要引起注意的情况,但不如error、warn重要
6
info
值得报告的一般消息
7
debug
由运行于debug模式的程序所产生的消息
8
图3是从一个访问错误文件中截取的几条记录。
这里使用winscp远程登录到Solaris10服务器的日志文件目录。
图3apache错误日志
从文件内容可以看出,每一行记录了一个错误。
格式为:
日期和时间错误等级错误消息
三、定义日志格式參數詳解
定制日志文件的格式涉及到两个指令,即LogFormat指令和CustomLog指令。
在httpd.conf文件中。
LogFormat指令定义格式并为格式指定一个名字,以后我们就可以直接引用这个名字。
CustomLog指令设置日志文件,并指明日志文件所用的格式。
LogFormat指令的功能是定义日志格式并为它指定一个名字。
例如,在默认的httpd.conf文件中,我们可以找到下面这行代码:
LogFormat"%h%l%u%t\"%r\"%>s%b"common
该指令创建了一种名为“common”的日志格式,日志的格式在双引号包围的内容中指定。
格式字符串中的每一个变量代表着一项特定的信息,这些信息按照格式串规定的次序写入到日志文件。
Apache文档已经给出了所有可用于格式串的变量及其含义:
----------------------------------------------------------------------
%...a:
远程IP地址
%...A:
本地IP地址
%...B:
已发送的字节数,不包含HTTP头
%...b:
CLF格式的已发送字节数量,不包含HTTP头。
例如当没有发送数据时,写入‘-’而不是0。
%...{FOOBAR}e:
环境变量FOOBAR的内容
%...f:
文件名字
%...h:
远程主机
%...H请求的协议
%...{Foobar}i:
Foobar的内容,发送给服务器的请求的标头行。
%...l:
远程登录名字(来自identd,如提供的话)
%...m请求的方法
%...{Foobar}n:
来自另外一个模块的注解“Foobar”的内容
%...{Foobar}o:
Foobar的内容,应答的标头行
%...p:
服务器响应请求时使用的端口
%...P:
响应请求的子进程ID。
%...q查询字符串(如果存在查询字符串,则包含“?
”后面的部分;否则,它是一个空字符串。
)
%...r:
请求的第一行
%...s:
状态。
对于进行内部重定向的请求,这是指*原来*请求的状态。
如果用%...>s,则是指后来的请求。
%...t:
以公共日志时间格式表示的时间(或称为标准英文格式)
%...{format}t:
以指定格式format表示的时间
%...T:
为响应请求而耗费的时间,以秒计
%...u:
远程用户(来自auth;如果返回状态(%s)是401则可能是伪造的)
%...U:
用户所请求的URL路径
%...v:
响应请求的服务器的ServerName
%...V:
依照UseCanonicalName设置得到的服务器名字
------------------------------------------------------------------
在所有上面列出的变量中,“...”表示一个可选的条件。
如果没有指定条件,则变量的值将以“-”取代。
有时候我们只想在日志中记录某些特定的、已定义的信息,这时就要用到“...”。
如果在“%”和变量之间放入了一个或者多个HTTP状态代码,则只有当请求返回的状态代码属于指定的状态代码之一时,变量所代表的内容才会被记录。
例如,如果我们想要记录的是网站的所有无效链接,那么可以使用:
----------------------------------------------------
LogFormat@4{Referer}iBrokenLinks
---------------------------------------------------
反之,如果我们想要记录那些状态代码不等于指定值的请求,只需加入一个“!
”符号即可:
LogFormat%!
200USomethingWrong
Web服务器日志配置和分析详解
(2)
一、Apache日志的滚动
1、为什么使用日志滚动
由于Apache进程本身不负责对日志文件进行滚动,因此必须使用其他程序配置日志滚动。
所有的日志文件都会随着时间的推移和访问次数的增加而迅速增长,因此必须对日志文件进行定期清理以免造成磁盘空间的不必要的浪费。
同时也加快了管理员查看日志所用的时间,因为打开小文件的速度比打开大文件的速度要快。
2、使用命令使用空的日志文件
要使系统重新使用空的日志文件,可以执行如下的命令:
cd /opt/coolstack/apache2/log
mv access_log access_log.old
mv error_log error_log.old
/opt/coolstack/apache2/bin/apachectl graceful
sleep 800
gzip access_log.old error_log.old
上面的指令片断是进行日志滚动的基础,用户可以自行编制脚本让cron执行。
下面介绍两种常用的日志滚动配置方法。
3、使用rotatelogs实现日志滚动
Apache自带的rotatelogs程序可以实现日志滚动。
rotatelogs是一个配合Apache管道日志功能使用的简单程序。
为了使用rotatelogs程序,需要在Apache配置文件中使用管道日志的配置。
rotatelogs命令的格式如图4:
rotatelogs命令的格式
其中:
-l:
使用本地时间代替GMT时间作为时间基准。
logfile:
日志文件名。
有两种格式表示新的日志开始使用的时间。
如果logfile中包含”%”,则它会被视为用于strftime()的格式字符串;常用的有:
%Y:
4位数的年份
%m:
2位数的月份
%d:
2位数的一个月中的日期数
%H:
2位数的小时数(24小时制)
%M:
2位数的分钟数
%S:
2位数的秒数
%U:
2位数的一年中的星期数(星期天为一周的第一天)
%W:
2位数的一年中的星期数(星期一为一周的第一天)
%w:
1位数的星期几(星期天为一周的第一天)
否则它会被自动加上以秒为单位的”.nnnnnnnnnn”后缀,这里nnnnnnnnnn是开始记录日志的格林威治时间距离1970年1月1日的秒数。
rotationtime:
日志文件滚动的以秒为单位的间隔时间。
offset:
相对于UTC的时差的分钟数。
如果省略,则假定为”0″并使用UTC时间。
比如,要指定UTC时差为”-5小时”的地区的当地时间,则此参数应为”-300″。
filesizeM:
指定以filesizeM文件大小滚动,而不是按照时间来滚动日志。
使用举例:
例1:
每过一天滚动日志,修改apache配置文件如下:
TransferLog "| /opt/coolstack/apache2/bin/rotatelogs / opt/coolstack/apache2/log /access.log 86400" combined
其中86400(秒)是日志滚动的时间。
86400秒就是1天。
滚动以后的文件名为/opt/coolstack/apache2/log/access.log/access_log.nnnnnnnnnn,这里nnnnnnnnnn是开始记录日志的格林威治时间距离1970年1月1日的秒数。
当日志滚动一次后将生成一个新的日志文件,后缀为前一个日志文件的后缀值加86400。
例2:
在日志文件大小增长到指定字节时滚动日志,修改apache配置文件如下:
TransferLog "|/opt/coolstack/apache2/bin/rotatelogs / opt/coolstack/apache2/log/apache2/access.log 20M" combined
此配置会在日志文件大小增长到20M字节时滚动该日志。
例3:
使用logrotate实现日志滚动
logrotate是Unix、Linux系统实现日志滚动的通用程序。
Linux下可以直接使用,Solaris10下要进行安装配置。
#wegt ftp:
//
#gunzip ftp:
//
#pkgadd –d logrotate-3.7.1-sol10-x86-local
图5是logrotate安装配置完成界面
logrotate安装配置完成界面
可以把配置文件/usr/local/doc/logrotate/examples/logrotate-default复制为配置文件/etc/logrotate.conf
可以把配置文件/usr/local/doc/logrotate/examples/logrotate.cron复制到文件目录/etc/cron.d/
下面看看配置文件如图6。
配置文件
logrotate的配置文件中可以看到,除了wtmp以外,需要滚动的日志的配置都保存在/etc/logroate.d目录下。
因此只需要在该目录下创建一个名为apache的配置文件,来指示logrotate如何轮循Web服务器的日志文件即可。
下面是一个示例:
/ opt/coolstack/apache2/log {
rotate 2
daily
missingok
sharedscripts
postrotate
/usr/bin/killall -HUP httpd 2> /dev/null || true
endscript
}
这里“rotate2”表示轮循时只包括两个备份文件,也就是只有access_log、access_log.1和access_log.2三个日志备份文件。
这种方法的优点是不需要其它第三方工具就可以实现日志轮循。
但是对于重负载的服务器和使用负载均衡技术的Web服务器来说,这种方法不是很实用。
因为它是对相应服务进程发出一个-HUP重启命令来实现日志的截断归档的,这样会影响服务的连续性。
例4:
使用使用cronolog实现日志滚动
cronolog(http:
//cronolog.org/)是基于rotatelogs的一个第三方工具软件。
cronolog可以非常整齐的将日志按天轮循存储,即每个日志文件存储的是00:
00:
00到23:
59:
59时间之内的所有日志。
1.准备gccforsolaris10编译器,这里用的版本:
gcc-3.3.2-sol10-intel-local.gz
2.下载解压缩文件
#wegt ftp:
//
#gizip –d gcc-3.3.2-sol10-intel-local.gz
3.安装
#pkgadd -d gcc-3.3.2-sol10-intel-local
接下来的安装,是一个交互安装过程
默认安装路径/usr/local/bin
4.设置PATH变量
# PATH=$PATH:
/usr/local/bin
#PATH=$PATH:
/usr/ccs/bin
# export PATH
5.准备coronolog,版本:
cronolog-1.6.2.tar.gz
6.下载安装:
#wegt http:
//cronolog.org/download/cronolog-1.6.2.tar.gz
# tar zxvf cronolog-1.6.2.tar.gz
# cd cronolog-1.6.2
# ./configure
# make
# make install
cronolog安装配置完成界面
可以看到默认是安装在/usr/local/sbin/下。
下面是一个使用cronolog的例子:
CustomLog "|/usr/local/sbin/cronolog / opt/coolstack/apache2/log /access.log.%Y-%m-%d" combined
他将按日志依次生成日志文件,如:
access.log.2008-09-18
access.log.2008-09-19
access.log.2008-09-20
access.log.2008-09-21
access.log.2008-09-22
若要压缩旧的日志文件或清除无用的日