在 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"
}
我正在尝试在 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"
}