有许多不同的软件包,可让您生成有关谁在访问您的网站以及他们在做什么的报告。目前最流行的是默认情况下在许多共享服务器上安装的“ 模拟 ”,“ Webalizer ”和“ AWStats ”。
尽管此类程序生成吸引人的报告,但它们只是从日志文件可以告诉您的内容开始。在本节中,我们研究了您可以更深入研究的方法-着重于使用简单的命令行工具,尤其是grep,awk和sed。
1.合并日志格式
以下内容假定采用Apache HTTP Server 组合日志格式,其中日志文件中的每个条目均包含以下信息:
%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-agent}i"
哪里:
%h = IP address of the client (remote host) which made the request %l = RFC 1413 identity of the client %u = userid of the person requesting the document %t = Time that the server finished processing the request %r = Request line from the client in double quotes %>s = Status code that the server sends back to the client %b = Size of the object returned to the client
最后两个项目:Referer和User-agent提供有关请求起源和发出请求的代理类型的详细信息。
样本日志条目:
66.249.64.13 - - [18/Sep/2004:11:07:48 +1000] "GET /robots.txt HTTP/1.0" 200 468 "-" "Googlebot/2.1" 66.249.64.13 - - [18/Sep/2004:11:07:48 +1000] "GET / HTTP/1.0" 200 6433 "-" "Googlebot/2.1"
注:该robots.txt的文件给予机器人为您的网站的一部分,他们被允许索引的指令。对/的请求是对默认索引页的请求,通常是 index.html。
2.使用awk
awk的主要用途是使用预定义的分隔符将文件的每一行分成“字段”或“列”。因为日志文件的每一行都是基于标准格式的,所以我们可以很容易地做很多事情。
使用默认分隔符(即任何空格(空格或制表符)),我们得到以下信息:
awk '{print $1}' combined_log # ip address (%h) awk '{print $2}' combined_log # RFC 1413 identity (%l) awk '{print $3}' combined_log # userid (%u) awk '{print $4,5}' combined_log # date/time (%t) awk '{print $9}' combined_log # status code (%>s) awk '{print $10}' combined_log # size (%b)
您可能会注意到我们错过了一些物品。为了到达它们,我们需要将定界符设置为“”字符,以改变行“爆炸”的方式并允许以下操作:
awk -F\" '{print $2}' combined_log # request line (%r) awk -F\" '{print $4}' combined_log # referer awk -F\" '{print $6}' combined_log # user agent
既然您了解了分解日志文件和识别不同元素的基础,那么我们可以继续看更实际的示例。
3.例子
您想按出现的次数(降序)列出所有用户代理:
awk -F\" '{print $6}' combined_log | sort | uniq -c | sort -fr
我们在这里所做的就是从日志文件中扩展出用户代理字段,并通过其他命令对其进行“插入”操作。第一种 是使uniq能够正确识别和计数唯一的用户代理。最后的排序按数字和名称(均为降序)对结果进行排序。
结果看起来类似于上述软件包之一生成的用户代理报告。不同之处在于您可以从任何一个或多个日志文件中生成任何时间。
如果您对访问者使用的是哪个操作系统或它们具有的浏览器扩展不特别感兴趣,则可以使用以下内容:
awk -F\" '{print $6}' combined_log \ | sed 's/(\([^;]\+; [^;]\+\)[^)]*)/(\1)/' \ | sort | uniq -c | sort -fr
注意:行尾的\只是表示命令将在下一行继续。
这将去除用户代理字符串的“放在括号内”组件中的第三个和后续值。例如:
Mozilla / 4.0(兼容; MSIE 6.0; Windows NT 5.1; .NET CLR)
变成:
Mozilla / 4.0(兼容; MSIE 6.0)
下一步是开始过滤输出,以便您可以缩小特定页面或引荐来源的范围。您想知道Google向您的网站请求了哪些页面吗?
awk -F\" '($6 ~ /Googlebot/){print $2}' combined_log | awk '{print $2}'
还是谁在看您的留言簿?
awk -F\" '($2 ~ /guestbook\.html/){print $6}' combined_log
是不是太简单了!
仅使用上面的示例,您已经可以生成自己的报告来备份ISP提供的任何类型的自动报告。您甚至可以编写自己的日志分析程序。
4.使用日志文件确定您的站点存在问题
下面概述的步骤将使您通过确定不同的服务器响应以及引起它们的请求来确定站点的问题:
awk '{print $9}' combined_log | sort | uniq -c | sort
输出显示您的网站收到的每种请求的数量。“正常”请求将产生200个代码,这意味着已请求并传送了页面或文件,但还有许多其他可能性。
最常见的响应是:
200 - OK 206 - Partial Content 301 - Moved Permanently 302 - Found 304 - Not Modified 401 - Unauthorised (password required) 403 - Forbidden 404 - Not Found
注意:有关状态代码的更多信息,您可以阅读文章HTTP服务器状态代码。
301或302代码表示该请求已被重定向。如果您担心带宽使用情况,您希望看到的是304个响应,这意味着不必交付文件,因为它们已经具有缓存的版本。
404代码可能表示您有问题-内部链接断开或有人链接到不再存在的页面。您可能需要修复该链接,使用断开的链接与网站联系,或者设置一个PURL,以便该链接可以再次使用。
下一步是确定哪些页面/文件正在生成不同的代码。以下命令将汇总404(“未找到”)请求:
# list all 404 requests awk '($9 ~ /404/)' combined_log # summarise 404 requests awk '($9 ~ /404/)' combined_log | awk '{print $9,$7}' | sort
或者,您可以使用反向正则表达式来汇总未返回200的请求(“确定”):
awk '($9 !~ /200/)' combined_log | awk '{print $9,$7}' | sort | uniq
或者,您可以包括(或在这种情况下排除)一系列响应,在这种情况下,请求返回200(“确定”)或304(“未修改”):
awk '($9 !~ /200|304/)' combined_log | awk '{print $9,$7}' | sort | uniq
假设您已识别出一个链接,该链接会产生很多404错误。让我们看看请求来自哪里:
awk -F\" '($2 ~ "^GET /path/to/brokenlink\.html"){print $4,$6}' combined_log
现在,您不仅可以看到引荐来源,还可以看到发出请求的用户代理。您应该能够确定站点内,外部站点上是否有断开的链接,或者搜索引擎或类似代理的地址是否无效。
如果无法修复该链接,则应考虑使用Apache mod_rewrite或类似的方案将请求重定向(301)到站点上最合适的页面。通过使用301而不是常规(302)重定向,您可以指示搜索引擎和其他智能代理,因为内容已“永久移动”,因此他们需要更新其链接。
5.谁在“热链接”我的图像?
当他们的带宽被直接链接到其他网站的图像使用时,确实使某些人感到烦恼。
您可以通过以下方式查看谁在对您的网站进行此操作。只需将www.example.net更改为您的域,然后将Combined_log更改 为您的合并日志文件即可。
awk -F\" '($2 ~ /\.(jpg|gif)/ && $4 !~ /^http:\/\/www\.example\.net/){print $4}' combined_log \ | sort | uniq -c | sort
翻译:
- 用“展开每行;
- 请求行(%r)必须包含“ .jpg”或“ .gif”;
- 推荐人不得以您的网站地址开头(在此示例中为www.example.net);
- 显示引荐来源和摘要。
您可以使用mod_rewrite阻止热链接,但是这也可能导致阻止各种搜索引擎结果页面,缓存和在线翻译软件。要查看是否正在发生这种情况,我们在图像请求中查找403(“禁止”)错误:
# list image requests that returned 403 Forbidden awk '($9 ~ /403/)' combined_log \ | awk -F\" '($2 ~ /\.(jpg|gif)/){print $4}' \ | sort | uniq -c | sort
翻译:
- 状态码(%> s)为403禁止;
- 请求行(%r)包含“ .jpg”或“ .gif”;
- 显示引荐来源和摘要。
您可能会注意到,上面的命令只是先前命令和先前提供的命令的组合。必须多次调用 awk,因为只有在分隔符设置为\“之后,” referer“字段才可用,而” status code“则直接可用。
6.空白的用户代理
“空白”用户代理通常表示该请求来自自动脚本或真正重视其隐私的人。以下命令将为您提供这些用户代理的IP地址列表,以便您确定是否需要阻止:
awk -F\" '($6 ~ /^-?$/)' combined_log | awk '{print $1}' | sort | uniq
通过logresolve的另一个管道将为您提供这些地址的主机名。