我需要帮助来了解如何使用另一个包含纳秒精度的日期和时间的字段的内容来设置 @timestamp 字段。我尝试使用日期匹配,但我不清楚范围必须使用哪种模式:
date {
match => ["timestamp_nano", "ISO8601"]
target => "@timestamp"
}
其中 timestamp_nano 是纳秒精度的时间戳(例如 "2022-01-20T12:00:00.123456789Z")。
通过使用 ISO8601,有毫秒精度,其余数字不会在 @timestamp 字段中报告。
比赛中使用哪种模式?
提前致谢
此答案适用于 8.0.0-rc1,因为 8.0 尚未发布。日期过滤器仍然使用 Joda 库,该库仅限于毫秒精度。引入纳秒精度的PR修复了底层 LogStash Timestamp 类,使其能够使用纳秒精度,但并非所有使用它的类。
如果我跑步
input { generator { count => 1 lines => [ '' ] } }
output { stdout { codec => rubydebug { metadata => false } } }
然后我得到@timestamp的微秒精度
"@timestamp" => 2022-01-22T01:14:15.881459Z,
但是,时间戳可以比这更准确。如果我使用 json 编解码器
input { generator { count => 1 lines => [ '{ "@timestamp": "2022-01-10T12:13:14.123456789"}' ] codec => json } }
output { stdout { codec => rubydebug { metadata => false } } }
我获得纳秒精度
"@timestamp" => 2022-01-10T17:13:14.123456789Z,
如果你想使用另一个字段的值,你可以这样做
input { generator { count => 1 lines => [ '' ] } }
filter {
mutate { add_field => { "foo" => "2022-01-10T12:13:14.123456789" } }
mutate { add_field => { "bar" => '{ "@timestamp": "%{foo}" } ' } }
json { source => "bar" }
}
上面 @badger 的回答非常好,但我更喜欢在 Logstash 8.x 中使用 Ruby 单步操作
input { generator { count => 1 lines => [ '' ] } }
filter {
mutate { add_field => { "[@timestamp_nanoseconds]" => "2022-08-11T10:10:10.123456789Z" } }
ruby {
code => "event.set('[@timestamp]', LogStash::Timestamp.new(event.get('[@timestamp_nanoseconds]')) )"
}
}
output { stdout {} }
我得到了纳秒精度的原生@timestamp
"@timestamp" => 2022-08-11T10:10:10.123456789Z,
我通过在 Elasticsearch 中添加管道得到了相同的结果:
{
"description": "mypipeline",
"processors": [
{
"date": {
"field": "timestamp_nano",
"formats": ["ISO8601"],
"output_format": "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSSZ"
}
}
]
}
timestamp_nano 包含纳秒精度的时间戳。
在 LogT 中,可以使用 Ruby 脚本来更新 @timestamp,如here所示,它可以工作,但作者说该脚本无法优化。
BR