在 Logstash 中定义新的时间戳

Defining a new timestamp in Logstash

我正在尝试在 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 中的 "registry" 文件,以便它再次流式传输日志文件。

我错过了什么?

编辑: 我能够通过像这样更改我的过滤器来恢复数据流:

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 仍被视为字符串。没看懂...

我做的实际上有 2 个明显的问题。

正如我指出的我对问题的编辑,日期过滤器是错误的。我不得不使用

match => ["tstamp", "ISO8601"]

"ISO8601" 代替 "TIMESTAMP_ISO8601"

那时,事情实际上是有效的,即使它不是很明显,因为默认情况下,Logstash 会用日期过滤器的结果覆盖 @timestamp 的值。为了避免这种情况,我不得不使用 target 选项:

target => "logdate"

我现在在 Kibana 中有一个 logdate 字段,类型为 date,我可以 select 在创建模式时将其作为时间过滤器。

所以我在 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"
}