Apache运维基础6Apache的日志管理与分析

36次阅读

共计 3632 个字符,预计需要花费 10 分钟才能阅读完成。

简述

Apache 访问日志在实际工作中非常有用,比较典型的例子是进行网站流量统计,查看用户访问时间、地理位置分布、页面点击率等。Apache 的访问日志具有如下 4 个方面的作用:

  1. 记录访问服务器的远程主机 IP 地址,从而可以得知浏览者来自何处;
  2. 记录浏览者访问的 Web 资源,可以了解网站中的哪些部分最受欢迎;
  3. 记录浏览者使用的浏览器,可以根据大多数浏览者使用的浏览器对站点进行优化;
  4. 记录浏览者的访问时间;

配置

定制日志文件的格式涉及到两个指令,即 LogFormat 指令和 CustomLog 指令,默认 httpd.conf 文件提供了关于这两个指令的几个示例。
LogFormat 指令定义格式并为格式指定一个名字,以后我们就可以直接引用这个名字。CustomLog 指令设置日志文件,并指明日志文件所用的格式(通常通过格式的名字)。
LogFormat 指令的功能是定义日志格式并为它指定一个名字。例如,在默认的 httpd.conf 文件中,我们可以找到下面这行代码:

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

该指令创建了一种名为“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 指令设定的服务器名称。%X 请求完成时的连接状态:X= 连接在应答完成前中断。+= 应答传送完后继续保持连接。-= 应答传送完后关闭连接。(在 1.3 以后的版本中,这个指令是 %c,但这样就和过去的 SSL 语法:%{var}c 冲突了)
%I 接收的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用 mod_logio 模块。%O 发送的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用 mod_logio 模块。

常见的日志格式举例

通用日志格式(CLF)

“%h %l %u %t \”%r\”%>s %b”

带虚拟主机的通用日志格式

“%v %h %l %u %t \”%r\”%>s %b”

NCSA 扩展 / 组合日志格式

“%h %l %u %t \”%r\”%>s %b \”%{Referer}i\”\”%{User-agent}i\”"

Referer 日志格式

“%{Referer}i -> %U”

Agent(Browser)日志格式

“%{User-agent}i”

apache 配置实例格式:


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

<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\"%>s %b \"%{Referer}i\"\"%{User-Agent}i\"%I %O" combinedio
</IfModule>

按时间分配记录

对于大访问量的网站,日志不可能只记录在一个文件里面,1 万日志大概就有 50M,还有一个可能就是你要跟踪用户的行为,可能需要一些额外的信息,怎么把这些东西记录到 apache 日志里面。apache 提供了很出色的日志配置方式,具体的配置可以参考:http://httpd.apache.org/docs/… 我这里只是简单的举一些例子。

实现按照小时记录日志

apache 自带有一个 rotatelogs 可以实现这个功能,查看一下他的 help 就知道使用的方法了。

Usage: rotatelogs [-l] <logfile> {<rotation time in seconds>|<rotation size in megabytes>} [offset minutes from UTC]

先看下面的例子:

<VirtualHost *:80>
    ServerAdmin webmaster@myhost.com
    DocumentRoot /home/web/www
    ServerName myhost.com
<Directory "/home/web/www">
    Options Indexes FollowSymLinks
    AllowOverride all
    Order allow,deny
    Allow from all
</Directory>
CustomLog "|bin/rotatelogs logs/myhost_access_log_%Y_%m_%d_%H.log 3600 480" common
</VirtualHost>

logs/pma_access_log_%Y_%m_%d_%H.log 是文件名字,可以用占位符。
3600 表示的是每个小时记录一次,这个单位是 s
480 表示和 UTC 时间差的分钟数目,我们是东八区要比他们早 480 分钟。

在日志中记录 cookie

我要记录一个用户的客户端的信息,并且每次用户访问,我都自动在浏览器里面写一个 cookie,及时发现恶意攻击或者用于广告系统中防止作弊。
首先启用 apache 自带的 user track 把 LoadModule usertrack_module modules/mod_usertrack.so 前面的 #去掉。
linux 用户的话,没有这个模块,那么就重新编译一下。


<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host2.domain
    DocumentRoot D:/web/htdocs
    ServerName localhost.com
    CookieTracking on
    CookieDomain .localhost.com
    CookieExpires "1 days"
    CookieStyle Cookie
<Directory "D:/web/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride all
    Order allow,deny
    Allow from all
</Directory>
LogFormat "%h %l %u %t \"%r\"%>s %b \"%{Referer}i\"\"%{User-agent}i\"\"%{Cookie}i\"" mylogconfig
CustomLog "|bin/rotatelogs logs/pma_access_log_%Y_%m_%d_%H.log 3600 480" mylogconfig
</VirtualHost>

CookieTracking on
CookieDomain .localhost.com
CookieExpires “1 days”
CookieStyle Cookie
这四句是设置 cookie 的属性的。

这一句是设置日志的属性:

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

日志的名字叫做 mylogconfig。

正文完
 0