更多



Apache服务器Access_log日志指令详解 不指定

郝聪 , 2016/11/01 11:15 , 搜索引擎优化(SEO) » SEO技术 , 评论(0) , 阅读(2047) , Via 本站原创 | |

访问日志中会记录服务器所处理的所有请求,其文件名和位置取决于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

一、Apache访问日志信息

当浏览器请求服务器时,如果在服务器上设置了访问日志,就会记录下用户的访问记录。

127.0.0.1(%h)

这是发送请求到服务器的客户的IP地址,即远程主机的地址,即它表明访问网站的究竟是谁。(可以要求apache查出所有的主机名字,并在日志文件中用主机名字来替代IP地址,但这种做法会极大的影响服务器记录日志的速度,从而降低整个网站的效率,不值得推荐)。

然而,如果确实有必要让apache找出远程主机的名字,可以使用指令:HostNameLookups on,如果HostNameLookups设置成double而不是on,日志记录程序将对它找到的主机名字进行反向查找,验证该主机名字确实指向了原来出现的IP地址。如果HostnameLookups设为On,则服务器会尝试解析这个IP地址的主机名并替换此处的IP地址,但并不推荐这样做,因为它会显著拖慢服务器,最好是用一个日志后续处理器来判断主机名,比如logresolve。如果客户和服务器之间存在代理,那么记录中的这个IP地址就是那个代理的IP地址,而不是客户机的真实IP地址。

-(%l)

日记记录的第二项是空白,用一个“-”占位符替代。实际上绝大多数时候这一项都是如此。这是由客户端identd进程判断的RFC1413身份(identity),输出中的符号"-"表示此处的信息无效。除非在严格控制的内部网络中,此信息通常很不可靠,不应该被使用。只有在将IdentityCheck指令设为On时,Apache才会试图得到这项信息。

frank(%u)

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

日志记录的第五项信息或许是整个日志记录中最有用的信息,它告诉我们服务器受到的是一个什么样的请求。该项信息的典型格式是“METHOD RESOURCE PROTOCOL”即“方法 资源 协议”(通常进行日志监控的时候,主要也是看这项内容)。引号中是客户端发出的包含许多有用信息的请求行。可以看出,该客户的动作是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程序可以根据不同的虚拟主机信息对日志进行拆分,并将结果存入不同的文件。

二、Apache访问日志配置

在apache的配置文件httpd.conf中,有一行是这么配置的:

CustomLog "logs/access.log" common 

指定了日志的目录路径./logs/,指定了日志的格式,默认common。
common格式是通过:LogFormat "%h %l %u %t \"%r\" %>s %b" common定义的。
双引号里面的格式字符串代表特定的信息。

apache格式字符串及其含义:

%%    百分号(Apache2.0.44或更高的版本)  
%a    远端IP地址  
%A    本机IP地址  
%B    除HTTP头以外传送的字节数  
%b    以CLF格式显示的除HTTP头以外传送的字节数,也就是当没有字节传送时显示'-'而不是0。  
%{Foobar}C    在请求中传送给服务端的cookieFoobar的内容。  
%D    服务器处理本请求所用时间,以微为单位。  
%{FOOBAR}e    环境变量FOOBAR的值  
%f    文件名  
%h    远端主机  
%H    请求使用的协议  
%{Foobar}i    发送到服务器的请求头Foobar:的内容。  
%l    远端登录名(由identd而来,如果支持的话),除非IdentityCheck设为"On",否则将得到一个"-"。  
%m    请求的方法  
%{Foobar}n    来自另一个模块的注解Foobar的内容。  
%{Foobar}o    应答头Foobar:的内容。  
%p    服务器服务于该请求的标准端口。  
%P    为本请求提供服务的子进程的PID。  
%{format}P 服务于该请求的PID或TID(线程ID),format的取值范围为:pid和tid(2.0.46及以后版本)以及hextid(需要APR1.2.0及以上版本)  
%q    查询字符串(若存在则由一个"?"引导,否则返回空串)  
%r    请求的第一行  
%s    状态。对于内部重定向的请求,这个状态指的是原始请求的状态,---%>s则指的是最后请求的状态。  
%t    时间,用普通日志时间格式(标准英语格式)  
%{format}t    时间,用strftime(3)指定的格式表示的时间。(默认情况下按本地化格式)  
%T    处理完请求所花时间,以秒为单位。  
%u    远程用户名(根据验证信息而来;如果返回status(%s)为401,可能是假的)  
%U    请求的URL路径,不包含查询字符串。  
%v    对该请求提供服务的标准ServerName。  
%V    根据UseCanonicalName指令设定的服务器名称。 

 

【补充】"<"和">"修饰符可以用来指定对于已被内部重定向的请求是选择原始的请求还是选择最终的请求。默认情况下,%s, %U,  %T, %D, %r 使用原始请求,而所有其他格式串则选择最终请求。例如,%>s可以用于记录请求的最终状态,而 %<u  则记录一个已经被内部重定向到非认证资源的请求的原始认证用户。 

如果在“%”和变量之间放入了一个或者多个HTTP状态代码,则只有当请求返回的状态代码属于指定的状态代码之一时,变量所代表的内容才会被记录。

例如,如果要记录的是网站的所有无效链接,可以使用:    

LogFormat %404{Referer}i BrokenLinks   

 

反之,如果要记录那些状态代码不等于指定值的请求,只需加入一个“!”符号即可: 

LogFormat %!200U SomethingWrong 

 

自定义日志格式,例如:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" " combine
 

定义了combine格式  其中\"%{Referer}i\" \"%{User-Agent}i\" 是发送到服务器的求情头和Referer链接。


发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]