0

我的具体问题是我有一组 Apache 访问日志,我想通过将它们分组到一组指定时间的时间窗口中,从中提取“汇总”的请求计数。

我的数据示例:

127.0.0.1 - - [01/Dec/2011:00:00:11 -0500] "GET / HTTP/1.0" 304 266 "-" "Sosospider+(+http://help.soso.com/webspider.htm)"
127.0.0.1 - - [01/Dec/2011:00:00:24 -0500] "GET /feed/rss2/ HTTP/1.0" 301 447 "-" "Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 1 subscribers; feed-id=12878631678486589417)"
127.0.0.1 - - [01/Dec/2011:00:00:25 -0500] "GET /feed/ HTTP/1.0" 304 189 "-" "Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 1 subscribers; feed-id=12878631678486589417)"
127.0.0.1 - - [01/Dec/2011:00:00:30 -0500] "GET /robots.txt HTTP/1.0" 200 333 "-" "Mozilla/5.0 (compatible; ScoutJet; +http://www.scoutjet.com/)"
127.0.0.1 - - [01/Dec/2011:00:00:30 -0500] "GET / HTTP/1.0" 200 10011 "-" "Mozilla/5.0 (compatible; ScoutJet; +http://www.scoutjet.com/)"

如您所见,每一行代表一个事件——在本例中为一个 HTTP 请求——并包含一个时间戳。

假设我的数据涵盖 3 天,并且我指定 1 天的时间窗口大小,我想生成如下内容:

Start    End     Count
2011-12-01 05:00     2011-12-02 05:00    2822
2011-12-02 05:00     2011-12-03 05:00    2572
2011-12-03 05:00     2011-12-04 05:00    604

但是我需要能够改变窗口的大小——我可能想使用 5 分钟、10 分钟、1 小时、1 天或 1 周等窗口来分析给定的数据集。

我还需要库/工具能够分析数百甚至数千兆字节的数据集(一系列行)。

可以通过标准输入接受数据的预构建工具会很棒,但是库会完全没问题,因为我可以围绕库构建工具。任何语言都可以;如果我不知道,我可以学习它。

我更愿意通过将访问日志数据直接传送到具有最小依赖性的工具/库中来做到这一点——我不是在寻找将数据存储在数据库中然后查询数据库进行分析的建议。如果需要,我可以自己解决。

我尝试了 Splunk,发现它对我的案例来说太重和太复杂了。它不仅仅是一个工具,它是一个完整的系统,拥有自己的数据存储、复杂的索引和查询能力等。

我的问题是:这样的库和/或工具是否存在?

全面披露

我必须承认,几个月前我实际上尝试过但没有找到类似的东西,所以我自己写了。出于某种原因,我当时没想过要发布这个问题。我将很快分享我在答案中写的 lib/tool。但我真的很好奇这样的事情是否存在;也许我几个月前在搜索时错过了它。

4

3 回答 3

1

正如问题中提到的,我实际上在几个月前试图找到这样的东西,但没有成功,所以我自己写了。(出于某种原因,我当时没想过要发布这个问题。)

我借此机会学习了函数式编程 (FP) 并提高了我对 CoffeeScript 的熟练程度。所以我把Rollups写成一个运行在Node上的CoffeeScript工具。作为我进一步探索 FP 的一部分,我已经添加了ScalaClojure版本。

所有版本都旨在用作工具和库,尽管它们都只是实现这一目标的一部分——我认为目前只有 Clojure 版本可以真正安全地用作库,而我还没有以这种方式对其进行了测试。

这些工具就像我在问题中描述的那样工作。给定一个或一组包含 Apache 访问日志的文件,我可以这样调用它们:

$ gzcat *.access.log.gz | rollup.clj -w 1d

(或rollup.coffee, rollup.scala),输出与问题中的示例完全相同。

这个工具解决了我的问题,我不再每天都在积极地使用它。但如果我知道其他人正在使用它,我很乐意进一步改进它以供其他人使用。所以欢迎反馈!

于 2012-04-12T14:21:12.937 回答
0

Splunk (http://www.splunk.com/) 将是我想到的解决此类问题的工具。它有免费和付费版本;我自己没有授权,只是使用它已经安装。

于 2012-04-11T18:23:07.857 回答
0

那么,这必须有多自动化?我可以给出一个仍然有用的不真实的答案吗?

如果你想成为真正的贫民窟,我通常做的就是一次性搞定一堆丑陋的贝壳。这是一个将使用一些cut技巧按小时汇总的方法,并且awk(我承认它不是很擅长,但速度非常快且功能强大)。

cat access_log | cut -d '[' -f 2 | cut -d ' ' -f 1 | cut -d ':' -f 1,2 | awk '{ date=$1; if (date==olddate) sum=sum+1; else { if (olddate!="") {print olddate,sum}; olddate=date; sum=1}} END {print date,sum}'

这篇关于用 awk 绘图的帖子帮助我弄清楚了聚合位。)

那应该输出如下内容:

12/Apr/2012:11 207
12/Apr/2012:12 188
12/Apr/2012:13 317

这可以很容易地与自己一起玩。awk 很整洁。

于 2012-04-18T01:31:56.233 回答