在Logstash中定义新的时间戳

时间:2018-11-14 14:37:23

标签: logging timestamp logstash elastic-stack logstash-grok

我正在尝试在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仍被视为字符串。我不明白...

1 个答案:

答案 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"
}