/ 中存储网

Apache服务器access_log日志指令详解

2014-02-03 13:04:01 来源:ITJS.CN

访问日志中会记录服务器所处理的所有请求,其文件名和位置取决于CustomLog指令,LogFormat指令可以简化日志的内容。

如何配置服务器的访问日志?

通用日志格式(Common Log Format)组合日志格式(Combined Log Format)多文件访问日志(条件日志此处不作介绍)

Common Log Format:

LogFormat "%h %l %u %t "%r" %>s %b" common

CustomLog logs/access_log common

它定义了一种特定的记录格式字符串,并给它起了个别名叫 common,其中的"%"指示服务器用某种信息替换,其他字符则不作替换。引号(")必须加反斜杠转义,以避免被解释为字符串的结束。格式字符串还可以包含特殊的控制符,如换行符"n" 、制表符"t"。

CustomLog

指令建立一个使用指定别名的新日志文件,除非其文件名是以斜杠开头的绝对路径,否则其路径就是相对于ServerRoot的相对路径。

上述配置是一种被称为通用日志格式(CLF)的记录格式,它被许多不同的Web服务器所采用,并被许多日志分析程序所识别,它产生的记录形如:

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326

记录的各部分说明如下:

127.0.0.1(%h)

这是发送请求到服务器的客户的IP地址。如果HostnameLookups设为On,则服务器会尝试解析这个IP地址的主机名并替换此处的IP地址,但并不推荐这样做,因为它会显著拖慢服务器,最好是用一个日志后续处理器来判断主机名,比如logresolve。如果客户和服务器之间存在代理,那么记录中的这个IP地址就是那个代理的IP地址,而不是客户机的真实IP地址。

-(%l)

这是由客户端identd进程判断的RFC1413身份(identity),输出中的符号"-"表示此处的信息无效。除非在严格控制的内部网络中,此信息通常很不可靠,不应该被使用。只有在将IdentityCheck指令设为On时,Apache才会试图得到这项信息。

frank(%u)

这是HTTP认证系统得到的访问该网页的客户标识(userid),环境变量REMOTE_USER会被设为该值并提供给CGI脚本。如果状态码是401,表示客户未通过认证,则此值没有意义。如果网页没有设置密码保护,则此项将是"-"。

[10/Oct/2000:13:55:36 -0700](%t)

这是服务器完成请求处理时的时间,其格式是:

[日/月/年:时:分:秒 时区]

日= 2数字

月= 3字母

年= 4数字

时= 2数字

分= 2数字

秒= 2数字

时区= (+|-)4数字

可以在格式字符串中使用%{format}t来改变时间的输出形式,其中的format与C标准库中的strftime()用法相同。

"GET /apache_pb.gif HTTP/1.0"("%r")

引号中是客户端发出的包含许多有用信息的请求行。可以看出,该客户的动作是GET,请求的资源是/apache_pb.gif,使用的协议是HTTP/1.0。另外,还可以记录其他信息,如:格式字符串"%m %U %q %H"会记录动作(方法)、路径、查询字符串、协议,其输出和"%r"一样。

200(%>s)

这是服务器返回给客户端的状态码。这个信息非常有价值,因为它指示了请求的结果,或者是被成功响应了(以2开头),或者被重定向了(以3开头),或者出错了(以4开头),或者产生了服务器端错误(以5开头)。完整的状态码列表参见HTTP规范(RFC2616第10章)。

2326(%b)

最后这项是返回给客户端的不包括响应头的字节数。如果没有信息返回,则此项应该是"-",如果希望记录为"0"的形式,就应该用%B。

Combined Log Format:

LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-agent}i"" combined

CustomLog log/access_log combined

这种格式与通用日志格式类似,但是多了两个 %{header}i 项,其中的header可以是任何请求头。这种格式的记录形如:

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"

其中,多出来的项是:

"http://www.example.com/start.html" ("%{Referer}i")

"Referer"请求头。此项指明了该请求是被从哪个网页提交过来的,这个网页应该包含有/apache_pb.gif或者其连接。

"Mozilla/4.08 [en] (Win98; I ;Nav)" ("%{User-agent}i")

"User-Agent"请求头。此项是客户端提供的浏览器识别信息。

多文件访问日志

可以简单地在配置文件中用多个CustomLog指令来建立多文件访问日志。如下例,既记录基本的CLF信息,又记录提交网页和浏览器的信息,最后两行CustomLog示范了如何模拟ReferLog和AgentLog指令的效果。

LogFormat "%h %l %u %t "%r" %>s %b" common

CustomLog logs/access_log common

CustomLog logs/referer_log "%{Referer}i -> %U"

CustomLog logs/agent_log "%{User-agent}i"

此例也说明了,记录格式可以直接由CustomLog指定,而并不一定要用LogFormat起一个别名(相当于上面第一二行组合,即:CustomLog logs/access_log "%h %l %u %t "%r" %>s %b")。

这里需要提到的是 关于多个虚拟机之间的日记记录管理:

如果服务器配有若干虚拟主机,那么还有几个控制日志文件的功能。首先,可以把日志指令放在<VirtualHost>段之外,让它们与主服务器使用同一个访问日志和错误日志来记录所有的请求和错误,但是这样就不能方便的获得每个虚拟主机的信息了。

如果把CustomLog或ErrorLog指令放在<VirtualHost>段内,所有对这个虚拟主机的请求和错误信息会被记录在其私有的日志文件中,那些没有在<VirtualHost>段内使用日志指令的虚拟主机将仍然和主服务器使用同一个日志。这种方法对虚拟主机较少的服务器很有用,但虚拟主机非常多时,就会带来管理上的困难,还经常会产生文件描述符短缺的问题。

对于访问日志,有一个很好的折衷方案,在同一个访问日志文件中记录对所有主机的访问,而每条记录都注明虚拟主机的信息,日后再把记录拆开存入不同的文件。例如:

LogFormat "%v %l %u %t "%r" %>s %b" comonvhost

CustomLog logs/access_log comonvhost

%v用来附加虚拟主机的信息。

有个split-logfile程序可以根据不同的虚拟主机信息对日志进行拆分,并将结果存入不同的文件。