本文分五个部分:访问日志、错误日志、定制日志、日志分析、其他用法。摘自
永远的Linux
,做了一些修整。
Apche日志系列(1):访问日志
想要知道什么人在什么时候浏览了网站的哪些内容吗?查看Apache的访问日志就可以知道。访问日志是Apache的标准日志,本文详细解释了访问日志的内容以及相关选项的配置。
一、访问日志的格式
Apache内建了记录服务器活动的功能,这就是它的日志功能。这个文章介绍的就是Apache的访问日志、错误日志,以及如何分析日志数据,如何定制Apache日志,如何从日志数据生成统计报表等内容。
如果Apache的安装方式是默认安装,服务器一运行就会有两个日志文件生成。这两个文件是access_log和error_log(在Win上是access.log和error.log)。采用默认安装方式时,这些文件可以在/usr/local/apache/logs下找到;对于Windows系统,这些日志文件将保存在Apache安装目录的logs子目录。不同的包管理器会把日志文件放到各种不同的位置,所以你可能需要找找其他的地方,或者通过配置文件查看这些日志文件配置到了什么地方。 【总结】
访问日志和错误日志的 位置 和 名字 :
Windows: <Apache安装目录>\logs\access.log | error.log
Linux: /usr/local/apache/logs/access_log | error_log
正如其名字所示,访问日志access_log记录了所有对Web服务器的访问活动。下面是访问日志中一个典型的记录:
例子:216.35.116.91 - - [19/Aug/2000:14:47:37 -0400] "GET / HTTP/1.0" 200 654
【总结】:日志名字段所代表的内容:
1.远程主机、2.空白(E-mail)、3.空白(登录名)、4.请求时间、5.方法+资源+协议、6.状态代码、7.发送字节数
这行内容由7项构成,上面的例子中有两项空白,但整行内容仍旧分成了7项。
第一项信息是远程主机的地址,即它表明访问网站的究竟是谁。在上面的例子中,访问网站的主机是216.35.116.91。随便说一句,这个地址属于一台名为si3001.inktomi.com的机器(要找出这个信息,可以使用nslookup工具查找DNS),inktomi.com是一家制作Web搜索软件的公司。可以看出,仅仅从日志记录的第一项出发,我们就可以得到有关访问者的不少信息。
默认情况下,第一项信息只是远程主机的IP地址,但我们可以要求Apache查出所有的主机名字,并在日志文件中用主机名字来替代IP地址。然而,这种做法通常不值得推荐,因为它将极大地影响服务器记录日志的速度,从而也就减低了整个网站的效率。另外,有许多工具能够将日志文件中的IP地址转换成主机名字,因此要求Apache记录主机名字替代IP地址是得不偿失的。
然而,如果确实有必要让Apache找出远程主机的名字,那么我们可以使用指令“HostNameLookups on”。
如果HostNameLookups设置成double而不是on,日志记录程序将对它找到的主机名字进行反向查找,验证该主机名字确实指向了原来出现的IP地址。默认情况下HostNameLookups设置为off。
上例日志记录中的第二项是空白,用一个“-”占位符替代。实际上绝大多数时候这一项都是如此。这个位置用于记录浏览者的标识,这不只是浏览者的登录名字,而是浏览者的email地址或者其他唯一标识符。这个信息由identd返回,或者直接由浏览器返回。很早的时候,那时Netscape 0.9还占据着统治地位,这个位置往往记录着浏览者的email地址。然而,由于有人用它来收集邮件地址和发送垃圾邮件,所以它未能保留多久,很久之前市场上几乎所有的浏览器就取消了这项功能。因此,到了今天,我们在日志记录的第二项看到email地址的机会已经微乎其微了。
Apche日志系列(1):访问日志
一、访问日志的格式
日志记录的第三项也是空白。这个位置用于记录浏览者进行身份验证时提供的名字。当然,如果网站的某些内容要求用户进行身份验证,那么这项信息是不会空白的。但是,对于大多数网站来说,日志文件的大多数记录中这一项仍旧是空白的。
日志记录的第四项是请求的时间。这个信息用方括号包围,而且采用所谓的“公共日志格式”或“标准英文格式”。因此,上例日志记录表示请求的时间是2000年8月19日星期三14:47:37。时间信息最后的“-0400”表示服务器所处时区位于UTC之前的4小时。
日志记录的第五项信息或许是整个日志记录中最有用的信息,它告诉我们服务器收到的是一个什么样的请求。该项信息的典型格式是“METHOD RESOURCE PROTOCOL”,即“方法 资源 协议”。
【总结】
METHOD: GET、POST、HEAD、……
RESOURCE: /、index.html、/default/index.php、……(请求的文件)
PROTOCOL: HTTP+版本号
在上例中,METHOD是GET,其他经常可能出现的METHOD还有POST和HEAD。此外还有不少可能出现的合法METHOD,但主要就是这三种。
RESOURCE是指浏览者向服务器请求的文档,或URL。在这个例子中,浏览者请求的是“/”,即网站的主页或根。大多数情况下,“/”指向DocumentRoot目录的index.html文档,但根据服务器配置的不同它也可能指向其他文件。
PROTOCOL通常是HTTP,后面再加上版本号。版本号或者是1.0,或者是1.1,但出现1.0的时候比较多。我们知道,HTTP协议是Web得以工作的基础,HTTP/1.0是HTTP协议的早期版本,而1.1是最近的版本。当前大多数Web客户程序仍使用1.0版本的HTTP协议。
日志记录的第六项信息是状态代码。它告诉我们请求是否成功,或者遇到了什么样的错误。大多数时候,这项值是200,它表示服务器已经成功地响应浏览器的请求,一切正常。状态代码的完整清单可以参考
维基百科中的HTTP状态码
。一般地说,以2开头的状态代码表示成功,以3开头的状态代码表示由于各种不同的原因用户请求被重定向到了其他位置,以4开头的状态代码表示客户端存在某种错误,以5开头的状态代码表示服务器遇到了某个错误。
日志记录的第七项表示发送给客户端的总字节数。它告诉我们传输是否被打断(即,该数值是否和文件的大小相同)。把日志记录中的这些值加起来就可以得知服务器在一天、一周或者一月内发送了多少数据。
二、配置访问日志
访问日志文件的位置实际上是一个配置选项。如果我们检查httpd.conf配置文件,可以看到该文件中有如下这行内容:
CustomLog /usr/local/apache/logs/access_log common 注意,对于版本较早的Apache服务器,这行内容可能略有不同。它使用的可能不是CustomLog指令,而是TransferLog指令。如果你的服务器属于这类情况,建议你尽可能地早日升级服务器。
CustomLog指令指定了保存日志文件的具体位置以及日志的格式。上面这行指令指定的是common日志格式,自从有了Web服务器开始,common格式就是它的标准格式。由此我们也可以理解,虽然几乎不再有任何客户程序向服务器提供用户的标识信息,但访问日志却还保留着第二项内容。
CustomLog指令中的路径是日志文件的路径,由于日志文件是由HTTP用户打开的(用User指令指定),因此必须注意这个路径要有安全保证,防止该文件被随意改写。
Apche日志系列(2):错误日志
错误日志和访问日志一样也是Apache的标准日志。本文分析错误日志的内容,介绍如何设置和错误日志相关的选项,文档错误和CGI错误的分类,以及如何方便地查看日志内容,等等。
二、配置访问日志
Apche日志系列(2):错误日志
一、文件名和位置
错误日志的文件名字是error_log(Windows平台是error.log)。
错误日志的位置可以通过ErrorLog指令设置:
ErrorLog logs/error.log
除非文件位置用“/”开头,否则这个
文件位置是相对于ServerRoot目录的相对路径
。如果Apache采用默认安装方式安装,那么错误日志的位置应该在/usr/local/apache/logs下。但是,如果Apache用某种包管理器安装,错误日志很可能在其他位置。 正如其名字所示,错误日志记录了服务器运行期间遇到的各种错误,以及一些普通的诊断信息,比如服务器何时启动、何时关闭等。
我们可以设置日志文件记录信息级别的高低,控制日志文件记录信息的数量和类型。这是通过LogLevel指令设置的,该指令默认设置的级别是error,即记录称得上错误的事件。有关该指令中允许设置的各种选项的完整清单,请参见
http://www.apache.org/docs/mod/core.html#loglevel
的Apache文档。
大多数情况下,我们在日志文件中见到的内容分属两类:文档错误和CGI错误。但是,错误日志中偶尔也会出现配置错误,另外还有前面提到的服务器启动和关闭信息。
二、文档错误
【说明】
1.日期和时间、2.记录等级、3.客户IP、4.错误信息。
可以看到,正如访问日志access_log文件一样,
错误日志记录也分成多个项
。
错误记录的开头是日期/时间标记,注意它们的格式和access_log中日期/时间的格式不同。access_log中的格式被称为“标准英文格式”,这或许是历史跟我们开的一个玩笑,但现在要改变它已经太迟了。
错误记录的第二项是当前记录的级别,它表明了问题的严重程度。这个级别信息可能是LogLevel指令的文档中所列出的任一级别(参见前面LogLevel的链接),error级别处于warn级别和crit级别之间。404属于error错误级别,这个级别表示确实遇到了问题,但服务器还可以运行。
错误记录的第三项表示用户发出请求时所用的IP地址。
记录的最后一项才是真正的错误信息。对于404错误,它还给出了完整路径指示服务器试图访问的文件。当我们料想某个文件应该在目标位置却出现了404错误时,这个信息是非常有用的。此时产生这种错误的原因往往是由于服务器配置错误、文件实际所处的虚拟主机和我们料想的不同,或者其他一些意料不到的情况。
由于用户身份验证问题而出现的错误记录如下所示:
[Tue Apr 11 22:13:21 2000] [error] [client 192.168.1.3] user rbowen@rcbowen.com : authentication failure for "/cgi-bin/hirecareers/company.cgi" : password mismatch
注意,由于文档错误是用户请求的直接结果,因此它们在访问日志中也会有相应的记录。
三、CGI错误
可以看到,CGI错误和前面的404错误格式相同,包含日期/时间、错误级别以及客户地址、错误信息。但这个CGI错误的错误信息有好几行,这往往会干扰一些错误日志分析软件的工作。
有了这个错误信息,即使是对Perl不太熟悉的人也能够找出许多有关错误的信息,例如至少可以方便地得知是哪几行代码出现了问题。Perl在报告程序错误方面的机制是相当完善的。当然,不同的编程语言输出到错误日志的信息会有所不同。
由于CGI程序运行环境的特殊性,如果没有错误日志的帮助,大多数CGI程序的错误都将很难解决。
有不少人在邮件列表或者新闻组中抱怨说自己有一个CGI程序,当打开网页时服务器却返回错误,比如“Internal Server Error”。我们可以肯定,这些人还没有看过服务器的错误日志,或者根本不知道错误日志的存在。决多大多数情况下,错误日志能够精确地指出CGI错误的所在以及如何修正这个错误。
四、查看日志文件
我常常告诉别人说,在进行开发的同时我会不断地检查服务器的日志,以便能够立即知道哪儿出了问题。但我得到的回答却往往是沉默。起先我以为这种沉默意味着“你当然得这样做”,后来我才发现这种沉默的真正含义是“我不知道别人的做法,但我自己是不干的。”
虽然如此,下面我们还是要看看如何方便地查看服务器日志文件。用telnet连接到服务器,然后输入下面的命令:
tail -f /usr/local/apache/logs/error_log //动态显示文件后几行内容 【补充】
tail命令
是用来显示linux系统的文本文件的最后几行的工具。和
head命令
正好相反。
该命令将显示出日志文件的最后几行内容,如果有新的内容加入到日志文件,它还会立即显示出新加入的内容。
四、查看日志文件
Windows用户也同样可以使用这种方法,比如可以使用各种为Windows提供的Unix工具软件包。我个人爱好一个称为AINTX的工具,它可以在
http://maxx.mc.net/~jlh/nttools/index.htm
找到。
还有一种替代方法是使用下面的Perl代码,它利用了一个称为File::Tail的模块:
use File::Tail;
$file=File::Tail->new("/some/log/file");
while (defined($line=$file->read)) {
print "$line";
}
无论具体采用的是哪一种方法,同时打开多个终端窗口都是一种好习惯:比如在一个窗口中显示错误日志,在另一个窗口中显示访问日志。这样,我们就能够随时获知网站上发生的事情并立即予以解决。
Apche日志系列(3):定制日志
一、定义日志格式
Apche日志系列(4):日志分析
一、可以得到哪些信息(4月4日)
Apche日志系列(5):其他用法
一、把日志记录写入到指定程序
二、轮换日志
三、多个虚拟主机的日志
<完>