Ruby中的扩展日志文件格式解析器

时间:2010-07-27 01:57:23

标签: ruby logging file-io w3c text-parsing

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

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

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

有谁知道这样的图书馆是否存在?如果不是,任何人都可以就如何构建一个提供建议?

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

此致 卡梅伦

1 个答案:

答案 0 :(得分:0)

让我们从强制要求开始,看看你尝试了什么。

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

您可以使用正则表达式或简单子字符串提取。子串提取更快但缺乏冷却因子。

require 'benchmark'

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

ary = %(#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
).split(/\n+/)

n = 50000
Benchmark.bm(6) do |x|
  x.report('regex') do
    n.times do
      ary.each do |l|
        next if 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
        timestamp, action, filepath = $1, $2, $3
      end
    end
  end

  x.report('substr') do
    n.times do
      ary.each do |l|  
        next if l[/^#/]
        l.strip!
        timestamp = l[0, 8]
        action    = l[9, 3]
        filepath  = l[14 .. -1]
      end
    end
  end
end

# >>             user     system      total        real
# >> regex   1.220000   0.000000   1.220000 (  1.235210)
# >> substr  0.800000   0.010000   0.810000 (  0.804276)

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

在基准代码的正则表达式和子字符串版本中,您可以根据所需内容提取ary.each do循环。