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

Logstash, grok filter not working for fixed length fields

我是 logstash 的新手,我有一个具有固定长度字段的输入文件和一个使用正则表达式配置的日志存储配置文件,如下所示:

首先是我的日志存储配置文件的内容-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

我从日志存储中得到的输出是:

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

有人可以帮我调试问题并让它正常工作吗?

感谢和问候, 普里亚

我假设你的问题不是 grok 表达式本身,而是文件输入读取测试文件的方式。

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

恕我直言,您应该首先确保您的 grok 正常工作。只需将 stdin 输入添加到您的输入部分,如下所示:

input {
    stdin {
    }

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

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

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