Web服务器日志配置和分析详解从某种程度上将”日志就是金钱”,因为通过日志能够分析出一个网站具有高流量,则广告商愿意为其支付费用。对于所有的公司或ICP来说,除了要保证网站稳定正常的运行以外,一个重要的问题就是网站访问量的统计和分析报表,这对于了解和监控网站的运行状态,提高各个网站的服务能力和服务水平是必不可少的。而这些要求都可以通过对Web服务器日志文件的统计和分析来实现。1.web日志分析原理web服务器日志记录了Web服务器接收处理请求及运行时错误等各种原始信息。通过对日志进行统计、分析和综合,就能有效地掌握服务器的运行状况、发现和排除错误原因、了解客户访问分布等,更好地加强系统的维护和管理。Web服务模式主要有三个步骤:服务请求,包含用户端的众多基本信息,如IP地址、浏览器类型、目标URL等。服务响应,Web服务器接收到请求后,按照用户要求运行相应的功能,并将信息返回给用户。如果出现错误,将返回错误代码。追加日志,服务器将对用户访问过程中的相关信息以追加的方式保存到日志文件中。如图1:2.Apache日志的配置2.1.日志类型1.3版本Apache的标准中规定了4类日志:错误日志、访问日志、传输日志、Cookie日志其中:传输日志和Cookie日志被Apache2.0认为已经过时。所以本文仅讨论错误日志和访问日志。同时错误日志和访问日志被Apache2.0默认设置。错误日志包含:获知失效链接、获知CGI错误、获知用户认证错误访问日志包含:访问服务器的远程机器的地址:可以得知浏览者来自何方浏览者访问的资源:可以得知网站中的哪些部分最受欢迎浏览者的浏览时间:可以从浏览时间(如工作时间或休闲时间)对网站内容进行调整浏览者使用的浏览器:可以根据大多数浏览者使用的浏览器对站点进行优化访问日志分类:为了便于分析Apache的访问日志,Apache的默认配置文件中,按记录的信息不同(用不同格式昵称说明不同的信息)将访问日志分为4类:1)普通日志格式(commonlogformat,CLF)common大多数日志分析软件都支持这种格式2)参考日志格式(refererlogformat)referrer记录客户访问站点的用户身份3)代理日志格式(agentlogformat)agent记录请求的用户代理4)综合日志格式(combinedlogformat)combined结合以上三种日志信息2.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\combinedLogFormat%h%l%u%t\%r\%s%bcommonLogFormat%{Referer}i-%UrefererLogFormat%{User-agent}iagent由于综合日志格式简单地结合了3种日志信息,所以在配置访问日志时,要么使用一个综合文件进行记录,要么使用分离的多个(1-3)文件记录。通常使用一个综合日志格式文件进行记录,配置为:CustomLog/var/log/apache2/access.logcombined若使用3个文件分别进行记录,配置为:CustomLog/var/log/apache2/access.logcommonCustomLog/var/log/apache2/referer.logrefererCustomLog/var/log/apache2/agent.logagent下面的命令组:LogFormat%h%l%u%t\%r\%s%bcommonCustomLoglogs/access_logcommon与下面的命令等效:CustomLoglogs/access_log%h%l%u%t\%r\%s%b通常我们配置访问日志时,使用先使用LogFormat命令定义格式昵称,然后再在CustomLog命令中引用昵称的方法。在使用LogFormat和CustomLog命令中为了说明要记录的日志内容,可以使用的常用格式说明符如表-3。格式说明符说明%v进行服务的服务器的标准名字ServerName,通常用于虚拟主机的日志记录中。%h客户机的IP地址。%l从identd服务器中获取远程登录名称,基本已废弃。%u来自于认证的远程用户。%t连接的日期和时间。%rHTTP请求的首行信息,典型格式是“METHODRESOURCEPROTOCOL”,即“方法资源协议”。经常可能出现的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远程登录到Solaris10服务器的日志文件目录:将其中一列各项信息分离于表-4所示:格式说明符举例1%h远程主机IP192.168.220.1%l-(表示没有取得信息)%u-%t访问日期,时间和时差14/Oct/2008:19:54:51+0800%r请求/版本GET/HTTP/1.1%s服务状态码404%b发送的字节数1185%{Referer}i”-”%{User-Agent}i3、配置错误日志错误日志记录了服务器运行期间遇到的各种错误,以及一些普通的诊断信息,比如服务器何时启动、何时关闭等。ErrorLog命令指定了当服务器遇到错误时记录错误日志的文件名。其格式为:格式1:ErrorLog错误日志文件名格式2:ErrorLog|管道程序名格式1直接指定错误日志文件名,除非文件位置用”/“开头,否则ErrorLog所制定的文件位置是相对于ServerRoot目录的相对路径。格式2实现管道日志,它指定一个命令来处理错误日志。Apache编译时默认的错误日志可以使用如下命令获得:$apache2-V|grepDEFAULT_ERRORLOG-DDEFAULT_ERRORLOG=logs/error_logLogLevelLogLevel用于调整记于错误日志中的信息的详细程度。等级应用说明级别emerg出现紧急情况使得该系统不可用,如系统宕机等1alert需要立即引起注意的情况2crit危险情况的警告3error除了emerg、alert、crit的其他错误4warn警告信息5notice需要引起注意的情况,但不如error、warn重要6info值得报告的一般消息7debug由运行于debug模式的程序所产生的消息8图3是从一个访问错误文件中截取的几条记录。这里使用winscp远程登录到Solaris10服务器的日志文件目录。图3apache错误日志从文件内容可以看出,每一行记录了一个错误。格式为:日期和时间错误等级错误消息三、定义日志格式參數詳解定制日志文件的格式涉及到两个指令,即LogFormat指令和CustomLog指令。在httpd.conf文件中。LogFormat指令定义格式并为格式指定一个名字,以后我们就可以直接引用这个名字。CustomLog指令设置日志文件,并指明日志文件所用的格式。LogFormat指令的功能是定义日志格式并为它指定一个名字。例如,在默认的httpd.conf文件中,我们可以找到下面这行代码:LogFormat%h%l%u%t\%r\%s%bcommon该指令创建了一种名为“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@4{Referer}iBrokenLinks---------------------------------------------------反之,如果我们想要记录那些状态代码不等于指定值的请求,只需加入一个“!”符号即可:LogFormat%!200USomethingWrongWeb服务器日志配置和分析详解(2)一、Apache日志的滚动1、为什么使用日志滚动由于