1

我正在寻找 W3C 扩展日志文件格式的 ruby​​ 解析器。

http://www.w3.org/TR/WD-logfile.html

理想情况下,它将根据日志文件中的字段生成一个多维数组。我正在考虑类似于 FasterCSV ( http://fastercsv.rubyforge.org/ ) 处理 CSV 文件的方式。

有谁知道这样的图书馆是否存在?如果没有,有人可以就我如何建造一个提供建议吗?

我很确定我可以弄清楚将文本文件转换为数组的字符串操作。我最关心的是处理大量日志文件(因此我可能需要将数据流回磁盘或其他东西)。

真诚的,卡梅伦

4

1 回答 1

0

让我们从强制性请求开始,看看您尝试了什么。

处理日志文件时,可伸缩性是一个大问题,因为它们会变得非常大。扩展格式比标准日志格式小,但您仍然必须注意消耗大量 RAM 的可能性。

您可以使用正则表达式或简单的子字符串提取。子字符串提取速度更快,但缺乏酷因素。

需要“基准”

TIME_REGEX = /(\d\d:\d\d:\d\d)/
ACTION_REGEX = /(\w+)/
FILEPATH_REGEX = /(\S+)/

ary = %(#Version: 1.0
#日期:1996 年 1 月 12 日 00:00:00
#Fields: time cs-method cs-uri
00:34:23 获取 /foo/bar.html
12:21:16 获取 /foo/bar.html
12:45:52 获取 /foo/bar.html
12:57:34 获取 /foo/bar.html
).split(/\n+/)

n = 50000
Benchmark.bm(6) 做 |x|
  x.report('regex') 做
    n.次做
      ary.each 做 |l|
        接下来如果 l[/^#/]
        l.strip!
        # l[/^ #{ TIME_REGEX } \s #{ ACTION_REGEX } \s #{ FILEPATH_REGEX } $/ix]
        # l =~ /^ #{ TIME_REGEX } \s #{ ACTION_REGEX } \s #{ FILEPATH_REGEX } $/ix
        l =~ /^ #{ TIME_REGEX } \s #{ ACTION_REGEX } \s #{ FILEPATH_REGEX } $/iox
        时间戳、操作、文件路径 = $1、$2、$3
      结尾
    结尾
  结尾

  x.report('substr') 做
    n.次做
      ary.each 做 |l|  
        接下来如果 l[/^#/]
        l.strip!
        时间戳 = l[0, 8]
        动作 = l[9, 3]
        文件路径 = l[14 .. -1]
      结尾
    结尾
  结尾
结尾

# >> 用户系统总实数
# >> 正则表达式 1.220000 0.000000 1.220000 ( 1.235210)
# >> substr 0.800000 0.010000 0.810000 (0.804276)

尝试运行不同的正则表达式,看看细微的变化如何在运行时产生很大的不同。

在基准代码的正则表达式和子字符串版本中,您可以提取ary.each do循环作为您正在寻找的基础。

于 2010-07-27T06:52:06.683 回答