web服务器日志配置和分析详解
从某种程度上将”日志就是金钱”,因为通过日志能够分析出一个网站具有高流量,则广告商愿意为其支付费用。对于所有的公司或ICP来说,除了要保证网站稳定正常的运行以外,一个重要的问题就是网站访问量的统计和分析报表,这对于了解和监控网站的运行状态,提高各个网站的服务能力和服务水平是必不可少的。而这些要求都可以通过对Web服务器日志文件的统计和分析来实现。
一、 web日志分析原理
web服务器日志记录了Web服务器接收处理请求及运行时错误等各种原始信息。通过对日志进行统计、分析和综合,就能有效地掌握服务器的运行状况、发现和排除错误原因、了解客户访问分布等,更好地加强系统的维护和管理。Web服务模式主要有三个步骤:
服务请求,包含用户端的众多基本信息,如IP地址、浏览器类型、目标URL等。
服务响应,Web服务器接收到请求后,按照用户要求运行相应的功能,并将信息返回给用户。如果出现错误,将返回错误代码。
追加日志,服务器将对用户访问过程中的相关信息以追加的方式保存到日志文件中。如图1 。
图1 Web服务模式主要有三个步骤
二、 Apache日志的配置
1、日志类型
1.3 版本Apache 的标准中规定了4类日志:
- 错误日志
- 访问日志
- 传输日志
- Cookie日志
其中:传输日志和Cookie日志被Apache 2.0认为已经过时。所以本文仅讨论错误日志和访问日志。同时错误日志和访问日志被Apache 2.0默认设置。
错误日志包含:
获知失效链接
获知 CGI 错误
获知用户认证错误
访问日志包含:
访问服务器的远程机器的地址:可以得知浏览者来自何方
浏览者访问的资源:可以得知网站中的哪些部分最受欢迎
浏览者的浏览时间:可以从浏览时间(如工作时间或休闲时间)对网站内容进行调整
浏览者使用的浏览器:可以根据大多数浏览者使用的浏览器对站点进行优化
访问日志分类:
为了便于分析 Apache 的访问日志,Apache 的默认配置文件中,按记录的信息不同(用不同格式昵称说明不同的信息)将访问日志分为4类:
普通日志格式(common log format,CLF)common 大多数日志分析软件都支持这种格式
参考日志格式(referer log format)referrer 记录客户访问站点的用户身份
代理日志格式(agent log format)agent 记录请求的用户代理
综合日志格式(combined log format)combined 结合以上三种日志信息
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 |
|
由于综合日志格式简单地结合了3种日志信息,所以在配置访问日志时,要么使用一个综合文件进行记录,要么使用分离的多个(1-3)文件记录。通常使用一个综合日志格式文件进行记录,配置为:
CustomLog /var/log/apache2/access.log combined |
若使用3个文件分别进行记录,配置为:
CustomLog /var/log/apache2/access.log common |
下面的命令组:
LogFormat "%h %l %u %t \"%r\" %>s %b" common |
与下面的命令等效:
CustomLog logs/access_log "%h %l %u %t \"%r\" %>s %b" |
通常我们配置访问日志时,使用先使用 LogFormat 命令定义格式昵称,然后再在 CustomLog 命令中引用昵称的方法。
在使用 LogFormat 和 CustomLog 命令中为了说明要记录的日志内容,可以使用的常用格式说明符如表-3。
格式说明符 |
说明 |
%v |
进行服务的服务器的标准名字 ServerName,通常用于虚拟主机的日志记录中。 |
%h |
客户机的 IP 地址。 |
%l |
从identd服务器中获取远程登录名称,基本已废弃。 |
%u |
来自于认证的远程用户。 |
%t |
连接的日期和时间。 |
%r |
HTTP请求的首行信息,典型格式是“METHOD RESOURCE PROTOCOL”,即“方法 资源 协议”。经常可能出现的 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远程登录到Solaris 10 服务器的日志文件目录。
图2 apache 访问日志
将其中一列各项信息分离于表-4所示。
格式说明符 |
|
举例1 |
%h |
远程主机IP |
192.168.220.1 |
%l |
|
-(表示没有取得信息) |
%u |
|
- |
%t |
访问日期,时间和时差
|
14/Oct/2008:19:54:51 +0800 |
%r |
请求 / 版本 |
"GET / HTTP/1.1" |
%>s |
服务状态码 |
|
%b |
发送的字节数 |
1185 |
%{Referer}i |
|
”-” |
%{User-Agent}i |
|
|
3、配置错误日志
错误日志记录了服务器运行期间遇到的各种错误,以及一些普通的诊断信息,比如服务器何时启动、何时关闭等。
ErrorLog 命令指定了当服务器遇到错误时记录错误日志的文件名。其格式为:
格式1:ErrorLog 错误日志文件名
格式2:ErrorLog "|管道程序名"
格式1直接指定错误日志文件名,除非文件位置用”/“开头,否则 ErrorLog 所制定的文件位置是相对于 ServerRoot 目录的相对路径。
格式2实现管道日志,它指定一个命令来处理错误日志。
Apache 编译时默认的错误日志可以使用如下命令获得:
$ apache2 -V| grep DEFAULT_ERRORLOG |
LogLevel
LogLevel 用于调整记于错误日志中的信息的详细程度。
等级 |
应用说明 |
级别 |
emerg |
出现紧急情况使得该系统不可用,如系统宕机等 |
1 |
alert |
需要立即引起注意的情况 |
2 |
crit |
危险情况的警告 |
3 |
error |
除了emerg、alert、crit的其他错误 |
4 |
warn |
警告信息 |
5 |
notice |
需要引起注意的情况,但不如error、warn重要 |
6 |
info |
值得报告的一般消息 |
7 |
由运行于debug模式的程序所产生的消息 |
8 |
图3是从一个访问错误文件中截取的几条记录。这里使用winscp远程登录到Solaris 10 服务器的日志文件目录。
图3 apache 错误日志
从文件内容可以看出,每一行记录了一个错误。格式为:
日期和时间 错误等级 错误消息
三、 定义日志格式參數詳解
定制日志文件的格式涉及到两个指令,即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 %404{Referer}i BrokenLinks
---------------------------------------------------
反之,如果我们想要记录那些状态代码不等于指定值的请求,只需加入一个“!”符号即可:
LogFormat %!200U SomethingWrong
四、 Apache日志的滚动
1、为什么使用日志滚动
由于Apache 进程本身不负责对日志文件进行滚动,因此必须使用其他程序配置日志滚动。所有的日志文件都会随着时间的推移和访问次数的增加而迅速增长,因此必须对日志文件进行定期清理以免造成磁盘空间的不必要的浪费。同时也加快了管理员查看日志所用的时间,因为打开小文件的速度比打开大文件的速度要快。
2、使用命令使用空的日志文件
要使系统重新使用空的日志文件,可以执行如下的命令:
cd /opt/coolstack/apache2/log |
上面的指令片断是进行日志滚动的基础,用户可以自行编制脚本让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下可以直接使用,Solaris 10 下要进行安装配置。
#wegt ftp://ftp.sunfreeware.com/pub/freeware/intel/10/logrotate-3.7.1-sol10-x86-local.gz |
图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”表示轮循时只包括两个备份文件,也就是只有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.准备gcc for solaris10 编译器,这里用的版本:gcc-3.3.2-sol10-intel-local.gz
2.下载解压缩文件
#wegt ftp://ftp.sunfreeware.com/pub/freeware/intel/10/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 |
5. 准备coronolog,版本:cronolog-1.6.2.tar.gz
6.下载安装:
#wegt http://cronolog.org/download/cronolog-1.6.2.tar.gz |
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 |
若要压缩旧的日志文件或清除无用的日志文件,可以使用 find 等命令 配合系统 crond 来实现。
五、 Apache 状态码詳解:
基本上可以分为五类:
1xx 为消息类,该类状态代码用于表示服务器临时回应。
100 Continue 表示初始的请求已经被服务器接受,浏览器应当继续发送请求的其余部分
101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议。
2xx 表示浏览器端请求被处理成功。
200 OK 一切正常。
201 Created 服务器已经创建了文档,Location 头给出了它的 URL。
202 Accepted 已经接受请求,但处理尚未完成。
203 Non-Authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝。
204 No Content 没有新文档,浏览器应该继续显示原来的文档。这个跟下面的 304 非常相似。
205 Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。
206 Partial Content 客户发送了一个带有 Range 头的GET请求,服务器完成了它。注意,通过 Range 可以实现断点续传。
3xx 重定向。
300 Multiple Choices 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。
301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。
302 Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTTP1.0中对应的状态信息是“Moved Temporatily”。
出现该状态代码时,浏览器能够自动访问新的URL,因此它是一个很有用的状态代码。
注意这个状态代码有时候可以和301替换使用。例如,如果浏览器错误地请求http://host/~user ,有的服务器返回301,有的则返回302。
严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。
303 See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取。
304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取。
307 Temporary Redirect 和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时 才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只 能跟随对GET请求的重定向。4xx 错误
4xx 客户端错误
400 Bad Request 请求出现语法错误。
401 Unauthorized 客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。
403 Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。
404 Not Found 无法找到指定位置的资源。这也是一个常用的应答。
405 Method Not Allowed 请求方法(GET、POST、HEAD、Delete、PUT、TRACE等)对指定的资源不适用。
406 Not Acceptable 指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容。
407 Proxy Authentication Required 类似于401,表示客户必须先经过代理服务器的授权。
408 Request Timeout 在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。
409 Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。
410 Gone 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用。
411 Length Required 服务器不能处理请求,除非客户发送一个Content-Length头。
412 Precondition Failed 请求头中指定的一些前提条件失败。
413 Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头。
414 Request URI Too Long URI太长。
416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。
5xx 服务器错误
500 Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。 (服务端的程序错误)
501 Not Implemented 服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求。
502 Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。
503 Service Unavailable 服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头。
504 Gateway Timeout 由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。
505 HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本。
HTTP错误代码详细介绍
"100" : Continue
"101" : witching Protocols
"200" : OK
"201" : Created
"202" : Accepted
"203" : Non-Authoritative Information
"204" : No Content
"205" : Reset Content
"206" : Partial Content
"300" : Multiple Choices
"301" : Moved Permanently
"302" : Found
"303" : See Other
"304" : Not Modified
"305" : Use Proxy
"307" : Temporary Redirect
HTTP 400 - 请求无效
HTTP 401.1 - 未授权:登录失败
HTTP 401.2 - 未授权:服务器配置问题导致登录失败
HTTP 401.3 - ACL 禁止访问资源
HTTP 401.4 - 未授权:授权被筛选器拒绝
HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败
HTTP 403 - 禁止访问
HTTP 403 - 对 Internet 服务管理器 (HTML) 的访问仅限于 Localhost
HTTP 403.1 禁止访问:禁止可执行访问
HTTP 403.2 - 禁止访问:禁止读访问
HTTP 403.3 - 禁止访问:禁止写访问
HTTP 403.4 - 禁止访问:要求 SSL
HTTP 403.5 - 禁止访问:要求 SSL 128
HTTP 403.6 - 禁止访问:IP 地址被拒绝
HTTP 403.7 - 禁止访问:要求客户证书
HTTP 403.8 - 禁止访问:禁止站点访问
HTTP 403.9 - 禁止访问:连接的用户过多
HTTP 403.10 - 禁止访问:配置无效
HTTP 403.11 - 禁止访问:密码更改
HTTP 403.12 - 禁止访问:映射器拒绝访问
HTTP 403.13 - 禁止访问:客户证书已被吊销
HTTP 403.15 - 禁止访问:客户访问许可过多
HTTP 403.16 - 禁止访问:客户证书不可信或者无效
HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效
HTTP 404.1 - 无法找到 Web 站点
HTTP 404 - 无法找到文件
HTTP 405 - 资源被禁止
HTTP 406 - 无法接受
HTTP 407 - 要求代理身份验证
HTTP 410 - 永远不可用
HTTP 412 - 先决条件失败
HTTP 414 - 请求 - URI 太长
HTTP 500 - 内部服务器错误
HTTP 500.100 - 内部服务器错误 - ASP 错误
HTTP 500-11 服务器关闭
HTTP 500-12 应用程序重新启动
HTTP 500-13 - 服务器太忙
HTTP 500-14 - 应用程序无效
HTTP 500-15 - 不允许请求 global.asa
Error 501 - 未实现
HTTP 502 - 网关错误