在某种程度上讲,“日志就是金钱”。因为如果能够通过日志分析出一个网站具有高流量,则广告商就愿意为此支付费用。对于所有的公司或ICP来说,除了要保证网站稳定正常的运行以外,一个重要的问题就是网站访问量的统计和分析报表,这对于了解和监控网站的运行状态,提高各个网站的服务能力和服务水平是必不可少的。而这些要求都可以通过对Web服务器日志文件的统计和分析来实现。
一、web日志分析原理
web服务器日志记录了Web服务器接收处理请求及运行时错误等各种原始信息。通过对日志进行统计、分析和综合,就能有效地掌握服务器的运行状况、发现和排除错误原因、了解客户访问分布等,更好地加强系统的维护和管理。Web服务模式主要有三个步骤:
服务请求,包含用户端的众多基本信息,如IP地址、浏览器类型、目标URL等。
服务响应,Web服务器接收到请求后,按照用户要求运行相应的功能,并将信息返回给用户。如果出现错误,将返回错误代码。
追加日志,服务器将对用户访问过程中的相关信息以追加的方式保存到日志文件中。如图1 。

图1 Web服务模式主要有三个步骤
表1 Web日志分析的元素
|
域 (Field)
|
描述 (Description)
|
|
日期(Date)
|
请求页面的时间、日期和时区(Date,time and time-zone of request)
|
|
客户端IP(Clien IP)
|
远程主机的IP或DNS入口(Remote host IP or DNS entry)
|
|
用户名(Username)
|
远程登陆的用户名(Remote login name of the user)
|
|
字节(Byte)
|
发送和接收的字节(Bytes transferred, sent or received)
|
|
服务器信息(Server)
|
包括服务器名称、IP和端口(Server name, IP address and port)
|
|
请求(Request)
|
URL查询(URL query)
|
|
状态(Status)
|
返回HTTP状态标识(HTTP status code returned to the client)
|
|
服务名(Service name)
|
用户请求的服务名称(Requested service name)
|
|
时间开销(Time cost)
|
完成浏览所用的时间(Time taken for transaction to complete)
|
|
协议及版本(Protocol and version)
|
传输用的协议及版本(Used transfer protocol and its version)
|
|
用户代理(User agent)
|
服务提供者(Service provider)
|
|
Cookie
|
标识号(Cookie ID)
|
|
参考页(Reference)
|
本页的上一页(Previous page)
|
目前常用的Web服务器有Apache、MS IIS等。而现在互联网上常用的Web服务器就是Apache,因此本文所做的讨论都将以Solaris 10 +Apache环境讨论(其它的应用环境与此类似)。对于Apache来说,支持多种日志文件格式,最常见的是common和combined两种模式。其中,combined方式比common方式日志信息中的Referer(表示该请求来自于哪里,例如来自于yahoo的搜索引擎)和User-agent(用户客户端类型,如firefox或IE)多。
二、Apache日志的配置
1、日志类型
1.3 版本Apache 的标准中规定了4类日志:
错误日志
访问日志
传输日志
Cookie日志
其中:传输日志和Cookie日志被Apache 2.0认为已经过时。所以本文仅讨论错误日志和访问日志。同时错误日志和访问日志被Apache 2.0默认设置。
错误日志包含:
获知失效链接
获知 CGI 错误
获知用户认证错误
访问日志包含:
访问服务器的远程机器的地址:可以得知浏览者来自何方
浏览者访问的资源:可以得知网站中的哪些部分最受欢迎
浏览者的浏览时间:可以从浏览时间(如工作时间或休闲时间)对网站内容进行调整
浏览者使用的浏览器:可以根据大多数浏览者使用的浏览器对站点进行优化
访问日志分类:
为了便于分析 Apache 的访问日志,Apache 的默认配置文件中,按记录的信息不同(用不同格式昵称说明不同的信息)将访问日志分为4类:
代理日志格式(agent log format) agent 记录请求的用户代理
综合日志格式(combined log format) combined 结合以上三种日志信息
普通日志格式(common log format,CLF) common 大多数日志分析软件都支持这种格式
参考日志格式(referer log format) referer 记录客户访问站点的用户身份
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\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent |
| CustomLog /var/log/apache2/access.log combined |
若使用3个文件分别进行记录,配置为:
| CustomLog /var/log/apache2/access.log common CustomLog /var/log/apache2/referer.log referer CustomLog /var/log/apache2/agent.log agent |
下面的命令组:
| LogFormat "%h %l %u %t \"%r\" %>s %b" common CustomLog logs/access_log common |
与下面的命令等效:
| CustomLog logs/access_log "%h %l %u %t \"%r\" %>s %b" |
通常我们配置访问日志时,使用先使用 LogFormat 命令定义格式昵称,然后再在 CustomLog 命令中引用昵称的方法。
在使用 LogFormat 和 CustomLog 命令中为了说明要记录的日志内容,可以使用的常用格式说明符如表-3。
|
格式说明符
|
说明
|
|
%v
|
进行服务的服务器的标准名字 ServerName,通常用于虚拟主机的日志记录中。
|
|
%h
|
客户机的 IP 地址。
|
|
%l
|
从identd服务器中获取远程登录名称,基本已废弃。
|
|
%u
|
来自于认证的远程用户。
|
|
%t
|
连接的日期和时间。
|
|
%r
|
HTTP请求的首行信息,典型格式是“METHOD RESOURCE PROTOCOL”,即“方法 资源 协议”。经常可能出现的 METHOD 是 GET、POST 和 HEAD;RESOURCE 是指浏览者向服务器请求的文档或 URL;PROTOCOL 通常是HTTP,后面再加上版本号,通常是 HTTP/1.1。
|
|
%>s
|
响应请求的状态代码,一般这项的值是 200,表示服务器已经成功地响应浏览器的请求,一切正常;以 3 开头的状态代码表示由于各种不同的原因用户请求被重定向到了其他位置;以 4 开头的状态代码表示客户端存在某种错误;以 5 开头的状态代码表示服务器遇到了某个错误。
|
|
%b
|
传送的字节数(不包含HTTP头信息),将日志记录中的这些值加起来就可以得知服务器在一天、一周或者一月内发送了多少数据。
|
|
%{Referer}i
|
记录引用此资源的网页。
|
|
%U
|
请求的URL路径,不包含查询串。
|
图2是从一个访问日志文件中截取的几条记录。这里使用winscp远程登录到Solaris 10 服务器的日志文件目录。

图2 apache 访问日志
将其中一列各项信息分离于表-4所示。
|
格式说明符
|
|
举例1
|
|
%h
|
远程主机IP
|
192.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}i
|
|
|
3、配置错误日志
错误日志记录了服务器运行期间遇到的各种错误,以及一些普通的诊断信息,比如服务器何时启动、何时关闭等。
ErrorLog 命令指定了当服务器遇到错误时记录错误日志的文件名。其格式为:
格式1:ErrorLog 错误日志文件名
格式2:ErrorLog "|管道程序名"
格式1直接指定错误日志文件名,除非文件位置用”/“开头,否则 ErrorLog 所制定的文件位置是相对于 ServerRoot 目录的相对路径。
格式2实现管道日志,它指定一个命令来处理错误日志。
Apache 编译时默认的错误日志可以使用如下命令获得:
| $ apache2 -V| grep DEFAULT_ERRORLOG -D DEFAULT_ERRORLOG="logs/error_log" |
LogLevel
LogLevel 用于调整记于错误日志中的信息的详细程度。
|
等级
|
应用说明
|
级别
|
|
emerg
|
出现紧急情况使得该系统不可用,如系统宕机等
|
1
|
|
alert
|
需要立即引起注意的情况
|
2
|
|
crit
|
危险情况的警告
|
3
|
|
error
|
除了emerg、alert、crit的其他错误
|
4
|
|
warn
|
警告信息
|
5
|
|
notice
|
需要引起注意的情况,但不如error、warn重要
|
6
|
|
info
|
值得报告的一般消息
|
7
|
|
debug
|
由运行于debug模式的程序所产生的消息
|
8
|
图3是从一个访问错误文件中截取的几条记录。这里使用winscp远程登录到Solaris 10 服务器的日志文件目录。

图3 apache 错误日志
从文件内容可以看出,每一行记录了一个错误。格式为:
日期和时间 错误等级 错误消息
三、Apache日志的滚动
1、为什么使用日志滚动
由于Apache 进程本身不负责对日志文件进行滚动,因此必须使用其他程序配置日志滚动。所有的日志文件都会随着时间的推移和访问次数的增加而迅速增长,因此必须对日志文件进行定期清理以免造成磁盘空间的不必要的浪费。同时也加快了管理员查看日志所用的时间,因为打开小文件的速度比打开大文件的速度要快。
2、使用命令使用空的日志文件
要使系统重新使用空的日志文件,可以执行如下的命令:
| cd /opt/coolstack/apache2/log mv access_log access_log.old mv error_log error_log.old /opt/coolstack/apache2/bin/apachectl graceful sleep 800 gzip access_log.old error_log.old |
上面的指令片断是进行日志滚动的基础,用户可以自行编制脚本让cron 执行。下面介绍两种常用的日志滚动配置方法。
3、使用 rotatelogs 实现日志滚动
Apache 自带的 rotatelogs 程序可以实现日志滚动。rotatelogs是一个配合 Apache 管道日志功能使用的简单程序。为了使用 rotatelogs 程序,需要在 Apache 配置文件中使用管道日志的配置。
rotatelogs 命令的格式如图4:

rotatelogs 命令的格式
其中:
-l:使用本地时间代替GMT时间作为时间基准。
logfile:日志文件名。有两种格式表示新的日志开始使用的时间。
如果 logfile中包含”%”,则它会被视为用于strftime()的格式字符串;常用的有:
%Y:4位数的年份
%m:2位数的月份
%d:2位数的一个月中的日期数
%H:2位数的小时数(24小时制)
%M:2位数的分钟数
%S:2位数的秒数
%U:2位数的一年中的星期数(星期天为一周的第一天)
%W:2位数的一年中的星期数(星期一为一周的第一天)
%w:1位数的星期几(星期天为一周的第一天)
否则它会被自动加上以秒为单位的”.nnnnnnnnnn”后缀,这里 nnnnnnnnnn 是开始记录日志的格林威治时间距离 1970年1月1日 的秒数。
rotationtime:日志文件滚动的以秒为单位的间隔时间。
offset:相对于UTC的时差的分钟数。如果省略,则假定为”0″并使用UTC时间。比如,要指定UTC时差为”-5小时”的地区的当地时间,则此参数应为”-300″。
filesizeM:指定以 filesizeM 文件大小滚动,而不是按照时间来滚动日志。
使用举例:
例1:每过一天滚动日志 ,修改apache配置文件如下:
| TransferLog "| /opt/coolstack/apache2/bin/rotatelogs / opt/coolstack/apache2/log /access.log 86400" combined |
其中 86400(秒)是日志滚动的时间。86400 秒就是 1 天。滚动以后的文件名为/ opt/coolstack/apache2/log /access.log /access_log.nnnnnnnnnn,这里 nnnnnnnnnn 是开始记录日志的格林威治时间距离 1970年1月1日 的秒数。当日志滚动一次后将生成一个新的日志文件,后缀为前一个日志文件的后缀值加 86400。
例2:在日志文件大小增长到指定字节时滚动日志 ,修改apache配置文件如下:
| TransferLog "|/opt/coolstack/apache2/bin/rotatelogs / opt/coolstack/apache2/log/apache2/access.log 20M" combined |
此配置会在日志文件大小增长到 20M 字节时滚动该日志。
例3:使用logrotate 实现日志滚动
logrotate 是Unix、Linux系统实现日志滚动的通用程序。Linux下可以直接使用,Solaris 10 下要进行安装配置。
| #wegt ftp://ftp.sunfreeware.com/pub/freeware/intel/10/logrotate-3.7.1-sol10-x86-local.gz #gunzip ftp://ftp.sunfreeware.com/pub/freeware/intel/10/logrotate-3.7.1-sol10-x86-local.gz #pkgadd –d logrotate-3.7.1-sol10-x86-local |
图5是logrotate安装配置完成界面

logrotate安装配置完成界面
可以把配置文件/usr/local/doc/logrotate/examples/ logrotate-default复制为配置文件/etc/logrotate.conf
可以把配置文件/usr/local/doc/logrotate/examples/ logrotate.cron复制到文件目录/etc/cron.d/
下面看看配置文件如图6。

配置文件
logrotate的配置文件中可以看到,除了wtmp以外,需要滚动的日志的配置都保存在/etc/logroate.d目录下。因此只需要在该目录下创建一个名为apache的配置文件,来指示logrotate如何轮循Web服务器的日志文件即可。下面是一个示例:
| / opt/coolstack/apache2/log { rotate 2 daily missingok sharedscripts postrotate /usr/bin/killall -HUP httpd 2> /dev/null || true endscript } |
这里“rotate 2”表示轮循时只包括两个备份文件,也就是只有access_log、access_log.1和access_log.2三个日志备份文件。这种方法的优点是不需要其它第三方工具就可以实现日志轮循。但是对于重负载的服务器和使用负载均衡技术的Web服务器来说,这种方法不是很实用。因为它是对相应服务进程发出一个-HUP重启命令来实现日志的截断归档的,这样会影响服务的连续性。
例4:使用使用 cronolog 实现日志滚动
cronolog (http://cronolog.org/ )是基于 rotatelogs 的一个第三方工具软件。cronolog 可以非常整齐的将日志按天轮循存储,即每个日志文件存储的是 00:00:00 到 23:59:59 时间之内的所有日志。
1.准备gcc for solaris10 编译器,这里用的版本:gcc-3.3.2-sol10-intel-local.gz
2.下载解压缩文件
| #wegt ftp://ftp.sunfreeware.com/pub/freeware/intel/10/gcc-3.3.2-sol10-intel-local.gz #gizip –d gcc-3.3.2-sol10-intel-local.gz |
3.安装
| #pkgadd -d gcc-3.3.2-sol10-intel-local |
接下来的安装,是一个交互安装过程
默认安装路径/usr/local/bin
4.设置PATH变量
| # PATH=$PATH:/usr/local/bin #PATH=$PATH:/usr/ccs/bin # export PATH |
5. 准备coronolog,版本:cronolog-1.6.2.tar.gz
6.下载安装:
| #wegt http://cronolog.org/download/cronolog-1.6.2.tar.gz # tar zxvf cronolog-1.6.2.tar.gz # cd cronolog-1.6.2 # ./configure # make # make install |

cronolog安装配置完成界面
可以看到默认是安装在/usr/local/sbin/下 。下面是一个使用 cronolog 的例子:
| CustomLog "|/usr/local/sbin/cronolog / opt/coolstack/apache2/log /access.log.%Y-%m-%d" combined |
他将按日志依次生成日志文件,如:
| access.log.2008-09-18 access.log.2008-09-19 access.log.2008-09-20 access.log.2008-09-21 access.log.2008-09-22 |
若要压缩旧的日志文件或清除无用的日志文件,可以使用 find 等命令 配合系统 crond 来实现。
总结:到此为止笔者介绍了Solaris 10 web服务器日志配置,本文使用的Apache版本是CoolStack http://cooltools.sunsource.net/coolstack/工具,apache版本2.2.9 。后边笔者会介绍使用PHPMyVisites、apachetop、analog三个工具进行web日志分析。