我正在尝试使用logstash将整个文本文件作为消息提供给ElasticSearch。我正在尝试使用多行编解码器,但我无法弄清楚我必须使用哪种模式。 ((。| \ n)*)此正则表达式匹配所有文本,但这不适用于logstash。
input {
file {
path => "/opt/rp/*.txt"
type => "rp"
start_position => "beginning"
stat_interval => 1
codec => multiline {
pattern => "((.|\n)*)"
negate => "false"
what => "next"
}
}
}
我应该使用什么模式来匹配文本文件的所有内容?
答案 0 :(得分:1)
所以对我来说,解决这个问题的关键是调整输入和过滤器。
这会进入您的输入{}:
file {
path => [ "/opt/rp/*.txt" ]
start_position => "beginning"
type => "rp"
}
这会进入你的过滤器{}:
if [type] == "rp" {
multiline {
pattern => "/.*./gm"
negate => true
what => "previous"
add_field => [ "executed_at", "%{@timestamp}" ]
}
}
所以你的conf。文件需要有这些段才能使它工作。
解释(afaik):
您可以使用输入中的start_position来从开头到结尾读取文件,而不是从头开始读取文件(以便流阅读器将其视为完整实体而非活动流)。
然后,你使用多线过滤器(不是编解码器,我试过 - 不适用于此),因为它是为此目的。模式是关键,即RegEx基本上匹配文件中的所有内容。否定被设置为true,所以即使它没有,否定否则会将其视为一个完整的文件。您使用previous,以便将内容添加到上一个条目而不是下一个条目。 add_field是可选的,但我发现它很有用,所以即使日志上没有定时名称/正确的时间戳,我也可以建立时间。
这是我发现为我工作的东西,尝试一下,如果它有效,请告诉我们(希望它确实如此)。