在Apache下的日志简介Apache提供了广泛记录运行时各方面信息的工具。比如有条件性的记录日志,日志循环,确定IP地址等时普遍会遇到的问题。还讲解很多用于检测您的Apache服务器状态以及分析其日志的捆绑的第三方模块和工具。默认的Apache日志文件Apache提供很多检测和日志工具来追踪服务器的正确运行。默认的Apache配置提供两个日志文件,放置在安装目录下的日志目录里面。access_log这个文件(在windows下对应access.log文件)包含了服务器已经处理过的请求的信息,比如说请求的URL,客户端的IP地址,请求是否被成功完成等。error_log这个文件(在windows下对应error.log文件)包含了与错误情况相关的信息,以及服务器生命周期中不同的大事件。创建日志格式LogFormat%h%l%u%t\%r\%s%bcommonLogFormat%h%l%u%t\%r\%s%b\%{Referer}i\\%{User-agent}i\combinedLogFormat指令允许你告诉Apache你想要记录请求的哪些方面。而你仍需附加的指令来告诉Apache在哪里记录那些信息,这在下一章中将会介绍。下面的例子显示了两种最受欢迎的格式的配置:普通日志格式和整合日志格式。当Apache收到一个请求,他将会用相应的请求属性来替代以%为前缀的每一个域。如果您正在使用普通日志格式,您的日志文件里的每一项输入看起来都将是这样的:192.168.200.4-someuser[12/Jun/2005:08:33:34+0500]GET/example.pngHTTP/1.02001234如果您正在使用整合日志格式,您的日志文件里的每一项输入看起来则都将是这样的:192.168.200.4-someuser[12/Jun/2005:08:33:34+0500]GET/example.pngHTTP/1.02001234(Windows;U;WindowsNT5.1;en-US;rv:1.7.7)尽管有附件提供日志格式的详尽索引,下表描述了一些最为重要的域:#%h:客户端(例如,浏览器)向服务器发出连接请求时自己的当时的IP地址或域名(需开启HostNameLookups)。#%u:使用HTTP方式认证用户时,记录下的用户的编号。#%t:服务器接受到连接请求的时间。#%r:客户端发出的原始连接请求中的文本信息,包含所使用的HTTP方法。#%s:服务器应答浏览器后的返回状态代码,200表示请求成功。.#%b:服务器应答浏览器发出的单个请求的回传对象的内容大小(字节为单位),不统计数据包头部字节。整合日志格式在普通日志格式的基础上扩展出了两个附加的域。定义为:#%{Referer}i:连接请求数据包包头,包含指向当前页面的文档关联信息。#%{User-agent}i:用户代理连接请求数据包包头,包含客户浏览器的信息。创建一个自定义日志文件CustomLoglogs/access_logcommonTransferLoglogs/sample.log您可能会想创建Apache自带以外的新的日志文件。下面的例子将运用CustomLog来创建一个新的日志文件,并保存由一个之前定义好的日志格式,即前一章提到的common,所定义的信息。您还可以用格式本身的定义来替换昵称。一个附加的,更为简单的指令是Transferlog,它只接受最后一个LogFormat指令提供的定义。重导向日志到一个外部的程序TransferLog|bin/rotatelogs/var/logs/apachelog86400你也可以用CustomLog或TransferLog将日志的输出重导向(输出)到一个外部的程序,而不是一个文件。要做到这一点,首先您需要以输出字符|开头,跟着是接收日志标准输入信息的程序之路经。本例运用Apache自带的rotatelogs程序,在稍后的章节中会对其有所介绍。当有一个外部程序被使用,它将作为启动httpd的用户被运行。如果服务器是被超级管理员所启动,它就会是超级管理员,完全确保这个程序是安全的。并且,当进入一个非Unix平台上的一个文件路径时,需要小心确保只有正斜杠被使用,即使这个平台可能是允许使用反斜杠的。总的来说,在整个配置文件中总是使用正斜杠是个好主意。有条件的日志请求SetEnvIfRequest_URI(\.gif|\.jpg)$imageCustomLoglogs/access_logcommonenv=!imageSetEnvIfRemote_Addr192\.168\.200\.5specialmachineCustomLoglogs/special_access_logcommonenv=specialmachine你可以根据可变的环境决定是否记录一个请求。这种可变可以根据许多参数,比如客户端的IP地址或请求中某个头部的存在,事先设置好。正如本例中所显示,CustomLog指令可以将可变的环境作为第三个参数来接受。如果存在可变的环境,它就将被记录,否则就不会。如果这个可变的环境被一个!开头否定,那么不存在可变的环境将会被记录。本例将告诉您如何避免在日志里以GIF和JPEG的格式记录图像,及如何从一个特定的IP地址记录请求道一个单独的日志文件。另一个例子请参加下一节。谁在连接你的网站SetEnvIfNoCaseReferer{Referer}i-%UrefererCustomLoglogs/referer.logrefererenv=!internalreferral可以通过记录Referer的值来检测哪些人连接了你的网站,Referer变量位于用户发送连接请求数据包的头部,数据包头中还包含了用户访问的目的网站的URL地址。通过这种方法可以记录下绝大部分网站访问者。也可以把来自特定网站()地址段的来访者排除出日志记录文件。利用模块参数(mod_status)来监视Apache服务器location/server-statusSetHandlerserver-statusOrderDeny,AllowDenyfromallAllowfrom192.168.0/locationApache服务器中可以使用的功能模块很多,有服务器内置的也有外挂的,这些模块工作的状态和性能就是通过mod_status参数来记录的,记录的内容有“哪些模块参与了网站应答服务、哪些模块处于空闲状态、服务器的开启/关闭时间。正在处理的连接请求数和访问者数量(需要指定ExtendedStatus记号)-该模块记录对高负荷网站服务器性能有很大影响”。例子中记录的模块状态统计结果可以用浏览器访问页面来查看。通过SNMP协议来监视Apache服务器SNMP是简单网管协议,支持SNMP的服务器或网络设备可以被OpenView、Tivoli等网管软件统一管理,目前有很多开源的SNMP模块可以加装到Apache网站服务器之上,对于Apache1.3版来讲,mod_snmp模块可以支持第1版和2版的SNMP协议;对于Apache2版来讲,mod_apache_snmp模块可以编译成Apache的DSO直接支持第1版、第2版和第3版的SNMP协议。有了SNMP模块,外部网管软件就可以对Apache网站服务器的各种实时性能参数进行查看了,这些参数包含“服务器连续在线时间、平均负载、一段时间内的错误数、提供网站服务的字节数和连接请求数”。SNMP模块遇到突然激增的并发连接请求数时会向控制台报警。管理SNMP资源的开源工具软件有:“net-snmp,OpenNMS,Najios等”。用开源工具分析日志有很多开源和商业版的工具软件可以对产生的Apache日志文件做分析和处理,通常的步骤是:1.选取一个日志文件。2.分析日志文件内容。3.生成包含不同类别内容的统计信息网页输出。Webalizer()和AWStats()是较为流行的日志文件分析工具;还有一些工具可以记录来访者具体访问路线,比如Vistors和Pathalizer工具,可以分别从和下载。实时监视日志使用apachetop命令行工具来显示apache服务器当前的运行状态,类似于Unix等系统下的top命令工具。对流量比较低的Unix-Apache网站也可以使用tail命令来记录实时日志信息,tail-f/logfile/。通过扫描错误日志文件中的记录,分析出恶意连接请求,常用的错误日志文件扫描工具有Logscan和ScanErrLog,可以分别从和去下载这些工具。将连接请求日志记录到数据库Apache本身没有将记录转发到数据库的功能,必须要第三方脚本和模块来支持。这里列举几个:mod_log_sql模块允许将连接请求直接记入MySQL数据库,然后用ApacheLogViewSQL工具来参看库中的记录;pglogd工具可以记录日志到PostgreSQL数据库中。将日志文件转存和归档CustomLog|bin/rotatelogs/var/logs/apachelog86400common如果网站流量较高,日志文件很容易就会变得很大,需要进行转存和归档处理。转存日志文件时需要压缩和保存,在线进行这项工作可以使用Apache提供的rotatelogs来完成,类似工具还可以在上找到。例子中用rotatelogs工具将每天的日志做了转存和归档处理,一天共有86400秒。查看Apache帮助文件可以了解更多的rotatelogs工具参数。注意如果rotatelogs工具所在的目录名含有空格,则需要用跳转符号\来指定。IP地址和域名之间对应处理将HostNameLookups设置成on,那么日志记录中将显示来访者所在的域名,设置成on可降低服务器性能。为了解决这一问题,Apache提供了一个事后分析IP地址域名信息的工具logresolve,例如$logresolveaccess_logresolved_log如果用代理服务器或网关设备来完成的网站访问,Apache服务器将只能记录到代理服务器和网关的IP地址和域名。如何自动启动Apache服务器#!/bin/bashif['ps-waux|grep-vgrep|grep-chttpd'-lt1];thenapachectlrestart;fi在windows平台下以服务方式启动的Aapche遇到意外退出后可以由服务管理器自动自动,Unix平台下需要借助watchdog脚本来实现自动启动功能,watchdog程序专门用来监视其他程序的运行状态,发现被监视的程序退出或停止后可以重新将他们启动。例子中简单的linux脚本将监视系统的进程表,如果网站服务器httpd进程消失,则负责将它重新启动,使用该脚本的条件有2个,首先保证该脚本文件具备可执行权限,第二必须将该文件设置到cron文件中,使之可以在预定的时间间隔内运行,如果使用Solaris系统,需要将例子中的ps-waux改成ps-ef。用户可以访问网页发现更多高级的watchdog类脚本工具,大多数linu