【问题标题】:Extended Log File Format Parser in RubyRuby 中的扩展日志文件格式解析器
【发布时间】:2010-07-27 15:00:20
【问题描述】:

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

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

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

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

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

真诚地, 卡梅伦

【问题讨论】:

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


    【解决方案1】:

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

    在处理日志文件时,可伸缩性是一个大问题,因为它们会变得非常大。扩展格式比标准日志格式小,但您仍需注意可能会消耗大量 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 循环作为您要查找的基础。

    【讨论】:

    • 我想知道在行之间分割 \t 字符。我实际上并没有解析 apache 日志。我想一般解析以扩展日志文件格式编写的任何内容。
    • 如果文件是严格的扩展日志文件格式,那么在选项卡上拆分应该可以正常工作...直到有人变得可爱并添加一个字段,然后在该字段内添加一个选项卡。在这种情况下,使用明确的字段长度或正则表达式拆分成字段会更好。
    • 根据此处找到的规范:w3.org/TR/WD-logfile.html 仅鼓励使用制表符作为字段分隔符。来自规范:“字段由空格分隔,鼓励为此使用制表符。”
    猜你喜欢
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多