Dec 07

让apache产生cookie并记录到日志

如果利用apache日志分析真实用户的访问?

默认情况下,apache日志记录是无状态的,一个真实访客的两次先后访问,在日志中除了ip和浏览器信息外,没有别的特征。有时候,很多人公用一个ip,甚至有时候取不到浏览器信息,比如对中国移动的手机们,默认就是这种状况。

怎么办呢?

我们可以让apache给客户端发送一个cookie,cookie内容是apache生成的一个用户唯一标记,例如:221.131.143.50.1260189290436924,表示ip 221.131.143.50上的一个访客,并把这个cookie内容打印到日志里,从而便于日后的统计和分析。

要做到这个并不麻烦:

  1. 打开httpd.conf,保证这一行没有被注释:LoadModule usertrack_module modules/mod_usertrack.so
  2. 在后面加一组配置:

<IfModule usertrack_module>
CookieExpires “1 weeks”
CookieStyle RFC2965
CookieName your_cookie_name

CookieTracking on
</IfModule>

3.找到apache日志配置部分,在里面加上配置,打印cookie信息:%{cookie}n,如:LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\” \”%V %v:%p %T\” %{cookie}n” combined。

4.重启apache,试着访问一下,现在就应该可以在combined所在的日志文件中看到cookie信息了。

Aug 17

apache日志格式关键字

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

该指令创建了一种名为“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设置得到的服务器名字

Apr 02

设置自动分割apache日志

首先安装cronolog,下载地址http://cronolog.org/download/index.html。下载后cronolog-1.6.2.tar.tar,进入目录cronolog-1.6.2,顺序执行:
1)./configure
2)make
3)make install
之后,/usr/local/sbin/目录下应当出现cronolog。

然后,打开apache配置文件httpd.conf,找到log_config_module这一节,做如下配置:
CustomLog “|/usr/local/sbin/cronolog /var/log/httpd/access_log.%Y-%m-%d” combined
当然,你也可以自定义你的日志格式,用来替换combined。

最后,重启apache就OK了。