将HTTP日志文件放入数据库(使用已定义的模式)的工具?

时间:2009-05-12 09:47:20

标签: http logfiles logfile-analysis

所以,我想把过去一年左右的Tomcat Combined Format个文件放到数据库中。有数以万计的点击率。

(计划是针对它进行定制和临时查询,并与其他一些数据相匹配。我们有一些问题,现有的日志分析产品无法为我们回答。)< / p>

我在寻找的是......

  1. 将文件干净地导入数据库的强大工具
  2. 存储和构建的现有(类型化,思考,无bug)架构
  3. 我离我自己的步伐只有一步,但这似乎是以前做过的事情 - 数以万亿次。

4 个答案:

答案 0 :(得分:1)

我会写剧本..

之前可能已经编写了无数次,但我怀疑它是针对正确的数据库,还是针对您的特定日志配置(不确定W3C扩展日志格式,但与许多其他人一样,您可以定义自定义格式)

查看log format doc,让每个字段广告在数据库中为其创建一个列应该是非常简单的。

然后,从日志格式doc解析示例日志:

#Version: 1.0
#Date: 12-Jan-1996 00:00:00
#Fields: time cs-method cs-uri
00:34:23 GET /foo/bar.html
12:21:16 GET /foo/bar.html
12:45:52 GET /foo/bar.html
12:57:34 GET /foo/bar.html

..以下脚本可以正常工作,只需几分钟即可完成:

import re
import sys

mr = re.compile("^(\d\d:\d\d:\d\d) ([A-Z]+) (.+)$")

def insert_into_database(time, rtype, uri):
    print "INSERT INTO database (%s, %s, %s)" % (time, rtype, uri)

for line in open("logfile.log").readlines():
    m = mr.match(line)
    if not m:
        sys.stderr.write("Invalid line: %s\n" % line.strip())
    else:
        insert_into_database(m.group(1), m.group(2), m.group(3))

可能不是有史以来最强大/最可靠的脚本,但它有效(除了insert_into_database函数之外!)

答案 1 :(得分:0)

这应该让你朝着正确的方向前进:

将Apache的日志写入MySQL http://onlamp.com/pub/a/apache/2005/02/10/database_logs.html

很容易适应其他数据库,或自定义架构。模式并没有太多 - 只需一个普通表就可以使用适当的字段和索引进行有效搜索。

答案 2 :(得分:0)

看看asql。它是一个perl脚本,可以将您的apache文件导入到sqlite数据库中。

答案 3 :(得分:0)

首先要意识到的是,这取决于日志文件的数量,这并不容易,而且还没有完成数十亿次。如果每天有千兆字节,那么最终将拥有TB级的数据库。平面表方法不能很好地解决这个问题。

我正在使用星型模式执行此操作。这样做的目的是使事实表(日志)保持较小,并将较大的字段(URL路径,用户代理,引用程序)移至维表。 MD5哈希(截断为64位)为我提供了舒适的键,用于将维度与事实表连接起来。此外,还具有带有已解析的URL路径的实例化视图。

好处是,能够对日志文件执行索引SQL查询实际上可以使您进入某个位置。使用grafana,我们可以看到一个图表,显示了一周以上的数据,这些图表显示了花费了超过一秒钟的产品详细信息页面的百分比。