Apache 访问日志在实际工做中很是有用,比较典型的例子是进行网站流量统计,查看用户访问时间、地理位置分布、页面点击率等。Apache 的访问日志具备以下4个方面的做用:html
定制日志文件的格式涉及到两个指令,即LogFormat指令和CustomLog指令,默认httpd.conf文件提供了关于这两个指令的几个示例。
LogFormat指令定义格式并为格式指定一个名字,之后咱们就能够直接引用这个名字。CustomLog指令设置日志文件,并指明日志文件所用的格式(一般经过格式的名字)。
LogFormat指令的功能是定义日志格式并为它指定一个名字。例如,在默认的httpd.conf文件中,咱们能够找到下面这行代码:linux
LogFormat "%h %l %u %t "%r" %>s %b" common
该指令建立了一种名为“common”的日志格式,日志的格式在双引号包围的内容中指定。格式字符串中的每个变量表明着一项特定的信息,这些信息按照格式串规定的次序写入到日志文件。
Apache文档已经给出了全部可用于格式串的变量及其含义,下面是其译文:web
%% 百分号(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)apache
“%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日志格式cookie
“%{Referer}i -> %U”
Agent(Browser)日志格式dom
“%{User-agent}i”
apache配置实例格式:ide
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,及时发现恶意攻击或者用于广告系统中防止做弊。
首先启用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。