Logstash凌乱的CSV文件

时间:2017-02-01 17:16:51

标签: regex csv logstash logstash-grok

我正在尝试使用 Logstash grok 来解析凌乱的 CSV 文件。

我最初使用的是 CSV过滤器,但这意味着我必须首先在预处理中删除一堆标头数据。

理想情况下,由于其简单性,我想再次使用 CSV过滤器。我无法控制 CSV 文件的到达方式。理想情况下,我希望 Logstash 能够处理所有内容而无需任何预处理。

以下是 CSV 文件的示例:

1,2,3,4,5,6,7
"text"
"text"

"01-Jan-2012"
"0123456789"

0,0,0,0,0,0,0,0,0,0

"col1Header",[...],col17Header"
"col1UoM",[...],col17UoM"

01-Jan-2012 11:00:01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
01-Jan-2012 11:00:02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
01-Jan-2012 11:00:03,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
01-Jan-2012 11:00:04,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

这是我的 Logstash 配置,它会产生评论中显示的错误:

input{
file{
    path => ["/opt/docs/*"]
    type => "log"
    start_position => "beginning"
    sincedb_path => "/dev/null"
    ignore_older => 0
    }
}
filter{
    grok{
        # error being returned here
        # error is: "Expected one of #, {, } at line 27, column 110 (byte 906) after filter{\n\t\n\n\t
# the regex following is to match all the header data that I don't want.
        match => {"header_data" => "(?<header_data>[0-9].*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*"\n)"}
    } # my plan was to then drop the header_data field (not implemented) and the data would be sent to the csv filter
    csv{
        columns => ["col17Header",[...],"col17Header]
    }
    mutate{
        convert => {"col2" => "float",[...] => "float","col17" => "float"}
    }
    date{
        match => ["col1","dd-MMM-YYYY HH:mm:ss"]
    }
}


output{
    elasticsearch{
        action => "index"
        hosts => ["192.168.1.118:9200"]
        index => "foo-logs"
    }
}

为清楚起见,这里产生了错误:

  

&#34;在第27行第110行(字节906)之后的#,{,}中预期的一个   过滤{\ n \吨\ n \ n \吨       #下面的正则表达式是匹配我不想要的所有标题数据。             match =&gt; {&#34; header_data&#34; =&GT; &#34;。。。。。。([0-9]的 \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ N *&#34; \ n)的&#34;}

我想删除底部4行以上的所有数据。我做了(我认为是低效的)正则表达式模式来查找标题和 CSV 数据。

CSV 文件中我需要的只是我示例文件中的最后4行,这是我需要的所有数据。

我的想法是,我目前没有以正确的方式做这件事,所以我对所有建议持开放态度。

1 个答案:

答案 0 :(得分:0)

从您的示例中,您想要的行具有唯一的模式:

^%{MONTHDAY}-%{MONTH}-%{YEAR}

了解那种模式。对于不匹配的行,您将获得grokparsefailure,然后可以使用drop {}过滤器忽略它们。