我正在寻找W3C扩展日志文件格式的ruby解析器。
http://www.w3.org/TR/WD-logfile.html
理想情况下,它会根据日志文件中的字段生成多维数组。我正在考虑类似于FasterCSV(http://fastercsv.rubyforge.org/)处理CSV文件的方式。
有谁知道这样的图书馆是否存在?如果不是,任何人都可以就如何构建一个提供建议?
我很确定我可以找出将文本文件转换为数组的字符串操作。我最关心的是处理大量日志文件(所以我可能需要将数据流回磁盘或其他东西)。
此致 卡梅伦
答案 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
循环。