我正在尝试在Logstash中定义新的时间戳,以便在Kibana报告中使用日志的时间戳而不是Filebeat时间戳。
我有以下内容,可以正常工作,但不允许我将日志时间戳记用作Kibana中的时间轴:
grok {
match => { "message" => "(?<timestamp>%{TIMESTAMP_ISO8601}) %{LOGLEVEL:loglevel} (?<class>[A-Za-z0-9$_.]+) %{NOTSPACE:method}\(%{JAVAFILE:class}:%{NONNEGINT:line}\) %{GREEDYDATA:message}$"
}
所以我这样修改了它,但是它不起作用:
grok {
match => { "message" => "(?<timestamp>%{TIMESTAMP_ISO8601:tstamp}) %{LOGLEVEL:loglevel} (?<class>[A-Za-z0-9$_.]+) %{NOTSPACE:method}\(%{JAVAFILE:class}:%{NONNEGINT:line}\) %{GREEDYDATA:message}$"
}
date {
match => ["tstamp", "TIMESTAMP_ISO8601"]
}
我试图添加我认为是Grok模式(“:tstamp”部分)中的值的命名,我发现了here,并将其定义为日期。但是当我使用它时,我再也没有在Kibana中看到任何数据了。
为了重新开始,我擦除了Kibana中的所有内容,并删除了Filebeat中的“注册表”文件,以使其再次流式传输日志文件。
我想念什么?
编辑:我能够通过更改过滤器来恢复数据流:
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:tstamp} %{LOGLEVEL:loglevel} (?<class>[A-Za-z0-9$_.]+) %{NOTSPACE:method}\(%{JAVAFILE:class}:%{NONNEGINT:line}\) %{GREEDYDATA:message}$" }
}
date {
match => ["tstamp", "ISO8601"]
}
但是我仍然只将@timestamp
视为时间过滤器。 tstamp仍被视为字符串。我不明白...
答案 0 :(得分:0)
我的作品实际上存在两个明显的问题。
当我指出我对问题的编辑时,日期过滤器是错误的。我不得不使用
match => ["tstamp", "ISO8601"]
使用"ISO8601"
代替"TIMESTAMP_ISO8601"
。
到那时,即使不是很明显,事情实际上仍在起作用,因为默认情况下,Logstash用日期过滤器的结果覆盖@timestamp
的值。为避免这种情况,我不得不使用target
选项:
target => "logdate"
我现在在Kibana中有一个logdate
类型的date
字段,创建样式时可以选择它作为时间过滤器。
所以我在Logstash中的最终过滤器如下所示:
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:tstamp} %{LOGLEVEL:loglevel} (?<class>[A-Za-z0-9$_.]+) %{NOTSPACE:method}\(%{JAVAFILE:class}:%{NONNEGINT:line}\) %{GREEDYDATA:message}$" }
}
date {
match => ["tstamp", "ISO8601"]
target => "logdate"
}