Logstash,grok过滤器不适用于固定长度的字段

时间:2015-11-13 15:08:37

标签: logstash logstash-grok

我是logstash的新手,我有一个带有固定长度字段的输入文件和一个用regexp配置的日志存储的配置文件,如下所示:

我的日志存储配置文件first-pipeline.conf

的内容
# The # character at the beginning of a line indicates a comment. Use
# comments to describe your configuration.
input {
    file {
        path => "/Users/priya/sample.log"
        start_position => beginning 
    }
}

filter {
    grok {
        match => ["message", "(?<RECORD_CODE>.{1})(?<SEQUENCE_NUMBER>.{6})(?<REG_NUMBER>.{12})(?<DATA_TYPE>.{3})"]
    }


}
output {

    stdout {}
}

我的sample.log文件的内容:

50000026311000920150044236080000000026
5000003631100092015005423608000000002
5000004631100092015006615054962

我从log stash获得的输出是:

priyas-MacBook-Pro:bin priya$ ./logstash -f first-pipeline.conf
Default settings used: Filter workers: 2
Logstash startup completed

有人可以帮助我调试问题并使其正常工作吗?

谢谢和问候, 普里亚

1 个答案:

答案 0 :(得分:1)

我认为你的案例中的问题不是grok表达式本身,而是文件输入读取测试文件的方式。

文件输入记住它最后从日志文件中读取的内容,并在后续运行中继续从该位置读取(它将此索引存储在名为since_db的特殊文件中)。 start_position =&gt; &#34;开始&#34;只有在您第一次启动logstash时才有效,在后续运行中它将从上次开始读取它意味着您不会在控制台中看到任何新行,除非您。)将新行添加到您的文件或b。)手动删除since_db文件(sincedb_path =&gt; null在Windows下不起作用,至少在我上次尝试时)。

所以你应该首先确保你的grok工作正常。要做的只是将stdin输入添加到输入部分,如下所示:

input {
    stdin {
    }

    file {
       path => "/Users/priya/sample.log"
       start_position => beginning 
    }
}

现在,只需在控制台中输入并按Enter即可手动创建logstash事件。这些事件将被解析为常规logstash事件,您将在控制台中看到生成的json(由stdout输出fitler完成)。

在确定你的grok正在运行之后,你可以检查是否正在按照预期的方式获取文件内容。重新启动logstash并在/Users/priya/sample.log文件中添加一行新数据(不要忘记新行末尾的newcline / CR,否则它将被拾取)。如果logstash选择新行,它应该出现在控制台输出中(因为你添加了stdout输出过滤器)。

相关问题