所以,我想把过去一年左右的Tomcat Combined Format个文件放到数据库中。有数以万计的点击率。
(计划是针对它进行定制和临时查询,并与其他一些数据相匹配。我们有一些问题,现有的日志分析产品无法为我们回答。)< / p>
我在寻找的是......
我离我自己的步伐只有一步,但这似乎是以前做过的事情 - 数以万亿次。
答案 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,我们可以看到一个图表,显示了一周以上的数据,这些图表显示了花费了超过一秒钟的产品详细信息页面的百分比。