下一页 上一页 目录

9. 访问日志

要有效地管理Web服务器,就有必要反馈服务器的活动、性能以及出现的问题。Apache HTTP服务器提供了非常全面而灵活的日志记录功能。

9.1 日志的配置

ErrorLog file-path|syslog[:facility] 指定了当服务器遇到错误时记录错误日志的文件。如果file-path不是一个以斜杠(/)开头的绝对路径,那么将被认为是一个相对于ServerRoot的相对路径。 示例

ErrorLog /var/log/apache2/error_log

LogFormat format|nickname [nickname] 本指令定义访问日志的记录格式。例如: LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common

LogLevel LogLevel用于调整记录在错误日志中的信息的详细程度。可以选择下列level,依照重要性降序排列

Level  描述  例子  
emerg  紧急(系统无法使用) "Child cannot open lock file. Exiting" 
alert  必须立即采取措施 "getpwuid: couldn't determine user name from uid" 
crit  致命情况 "socket: Failed to get a socket, exiting child" 
error  错误情况 "Premature end of script headers" 
warn  警告情况 "child process 1234 did not exit, sending another SIGHUP" 
notice  一般重要情况 "httpd: caught SIGBUS, attempting to dump core in ..." 
info  普通信息 "Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)..." 
debug  调试信息 "Opening config file ..."

CustomLog file|pipe format|nickname [env=[!]environment-variable] CustomLog指令用来对服务器的请求进行日志记录。可以指定日志的格式,也可以使用环境变量根据请求的特征来自由地组织日志。

9.2 错误日志

错误日志是最重要的日志文件,其文件名和位置取决于ErrorLog指令。Apache httpd将在这个文件中存放诊断信息和处理请求中出现的错误,由于这里经常包含了出错细节以及如何解决,如果服务器启动或运行中有问题,首先就应该查看这个错误日志。

错误日志通常被写入一个文件(debian下是error.log)。

错误日志的格式相对灵活,并可以附加文字描述。某些信息会出现在绝大多数记录中,一个典型的例子是:

[Sat Jul 15 09:58:28 2006] [error] [client 192.168.1.254] File does not exist: /var/www/apache2-default/index.html.zh

其中

第一项是错误发生的日期和时间;

第二项是错误的严重性,LogLevel指令使只有高于指定严重性级别的错误才会被记录;

第三项是导致错误的IP地址;此后是信息本身,在此例中,提示客户端访问的文件在服务器上不存在。

错误日志中会包含类似上述例子的多种类型的信息。此外,CGI脚本中任何输出到stderr的信息会作为调试信息原封不动地记录到错误日志中。

用户可以增加或删除错误日志的项。但是对某些特殊请求,在访问日志(access log)中也会有相应的记录,比如上述例子在访问日志中也会有相应的记录,其状态码是404,因为访问日志也可以定制,所以可以从访问日志中得到错误事件的更多信息。

9.3 访问日志

正如其名字所示,访问日志access_log记录了所有对Web服务器的访问活动。

下面是访问日志中一个典型的记录:

192.168.1.254 - tony [22/Jul/2006:09:41:58 +0800] "GET /index.html HTTP/1.1" 200 438 "-" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060406 Firefox/1.5.0.4 (Debian-1.5.dfsg+1.5.0.4-1)"

这行内容由9项构成,上面的例子中有两项空白,但整行内容仍旧分成了9项。

第一项信息是远程主机的地址。如果你想知道这个IP地址的域名,可通过nslookup或者host命令来查看。如果你想让Apache自己找出这个IP的主机名,可以打开这个开关:HostnameLookups。(建议最好不要打开,会影响Apache记录服务器日志的速度)

第二项是空白,用一个"-"占位符替代。实际上绝大多数时候这一项都是如此。这个位置用于记录浏览者的标识,这不只是浏览者的登录名字,而是浏览者的email地址或者其他唯一标识符。这个信息由identd返回,或者直接由浏览器返回。很早的时候,那时Netscape 0.9还占据着统治地位,这个位置往往记录着浏览者的email地址。然而,由于有人用它来收集邮件地址和发送垃圾邮件,所以它未能保留多久,很久之前市场上几乎所有的浏览器就取消了这项功能。因此,到了今天,我们在日志记录的第二项看到email地址的机会已经微乎其微了。

第三项是tony。这个位置用于记录浏览者进行身份验证时提供的名字。当然,如果网站的某些内容要求用户进行身份验证,那么这项信息是不会空白的。但是,对于大多数网站来说,日志文件的大多数记录中这一项仍旧是空白的。

日志记录的第四项是请求的时间。这个信息用方括号包围,而且采用所谓的"公共日志格式"或"标准英文格式"。因此,上例日志记录表示请求的时间是2006年7月22日09:41:58。时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时。

日志记录的第五项信息或许是整个日志记录中最有用的信息,它告诉我们服务器收到的是一个什么样的请求。该项信息的典型格式是"METHOD RESOURCE PROTOCOL",即"方法 资源 协议"。

RESOURCE是指浏览者向服务器请求的文档,或URL。在这个例子中,浏览者请求的是"/index.html "。

在上例中,METHOD是GET,其他经常可能出现的METHOD还有POST和HEAD。此外还有不少可能出现的合法METHOD,但主要就是这三种。

PROTOCOL通常是HTTP,后面再加上版本号。

日志记录的第六项信息是状态代码。它告诉我们请求是否成功,或者遇到了什么样的错误。大多数时候,这项值是200,它表示服务器已经成功地响应浏览器的请求,一切正常。一般地说,以2开头的状态代码表示成功,以3开头的状态代码表示由于各种不同的原因用户请求被重定向到了其他位置,以4开头的状态代码表示客户端存在某种错误,以5开头的状态代码表示服务器遇到了某个错误。

日志记录的第七项表示发送给客户端的总字节数。它告诉我们传输是否被打断(即,该数值是否和文件的大小相同)。把日志记录中的这些值加起来就可以得知服务器在一天、一周或者一月内发送了多少数据。

日志记录的第八项记录的是客户在提出请求时所在的目录或URL。 这个例子里为空.

日志记录的第九项表示客户端的详细信息,这样你就不难理解为什么有些网站能够在页面中显示你的IP、OS、Browser了。


下一页 上一页 目录