如何将数据类型从 String Logstash 更改为 ISODate MongoDB
How to change datatype from String Logstash to ISODate MongoDB
我有一些日志由 Filebeat 读取,在 Logstash 中过滤并发送到 MongoDB。 Filebeat 在日志上生成@timestamp 字段,日志可能如下所示
{
"_id" : ObjectId("622884e8ed814f1590000076"),
"@timestamp" : "\"2022-03-09T10:43:46.000\"",
"stream" : "stderr",
"message" : "[2022-03-09T10:43:46.528612+00:00] testing.INFO: Message error [] []"
}
但@timestamp 字段写为字符串而不是日期。我必须在 MongoDB 上读取时间戳作为 ISODate。它可能看起来像这样
"@timestamp": ISODate("2022-03-10T01:43:46.000Z")
而不是
"@timestamp" : "\"2022-03-09T10:43:46.000\""
关于如何将数据类型从字符串更改为日期有什么建议吗?
更新
尝试使用匹配日期过滤器。
date {
match => [ "@timestamp", "MMM dd yyyy HH:mm:ss", "MMM d yyyy HH:mm:ss", "ISO8601" ]
}
}
在 mongo 上,数据类型仍然没有改变。我还尝试使用此
创建另一个具有当前日期 (logstash_processed_at) 的字段
ruby {
code => "event.set('logstash_processed_at', Time.now());"
}
也使用日期匹配,但在 mongo 上数据类型仍然是字符串
这里是如何转换已经在mongoDB中的时间戳:
db.collection.update({},
[
{
$addFields: {
"@timestamp": {
$dateFromString: {
dateString: {
$substr: [
"$@timestamp",
1,
23
]
}
}
}
}
}
],
{
multi: true
})
但是您需要修复注入并使用 logstash filter 以便将字符串中的日期转换为 ISODate() 中的日期:
filter {
date {
match => [ "logdate", "MMM dd yyyy HH:mm:ss", "MMM d yyyy HH:mm:ss", "ISO8601" ]
}
}
同时检查 here monggodb 输出插件:
等号
值类型是布尔值
默认值为假
如果为真,则将 MongoDB 中的 @timestamp 字段存储为 ISODate 类型而不是 ISO8601 字符串。
它没有更改过滤器,而是通过在 logstash 配置的输出 mongodb 上添加新字段来解决。该字段是 isodate => true.
output {
mongodb {
...
isodate => true
}
}
此字段在发送到 mongodb 时将 @timestamp 字段从字符串更改为 ISODate() 格式。如果您正在寻找 如何在 mongodb 中将时间戳更改为 ISODate(),@R2D2 在那里有答案。
我有一些日志由 Filebeat 读取,在 Logstash 中过滤并发送到 MongoDB。 Filebeat 在日志上生成@timestamp 字段,日志可能如下所示
{
"_id" : ObjectId("622884e8ed814f1590000076"),
"@timestamp" : "\"2022-03-09T10:43:46.000\"",
"stream" : "stderr",
"message" : "[2022-03-09T10:43:46.528612+00:00] testing.INFO: Message error [] []"
}
但@timestamp 字段写为字符串而不是日期。我必须在 MongoDB 上读取时间戳作为 ISODate。它可能看起来像这样
"@timestamp": ISODate("2022-03-10T01:43:46.000Z")
而不是
"@timestamp" : "\"2022-03-09T10:43:46.000\""
关于如何将数据类型从字符串更改为日期有什么建议吗?
更新 尝试使用匹配日期过滤器。
date {
match => [ "@timestamp", "MMM dd yyyy HH:mm:ss", "MMM d yyyy HH:mm:ss", "ISO8601" ]
}
}
在 mongo 上,数据类型仍然没有改变。我还尝试使用此
创建另一个具有当前日期 (logstash_processed_at) 的字段ruby {
code => "event.set('logstash_processed_at', Time.now());"
}
也使用日期匹配,但在 mongo 上数据类型仍然是字符串
这里是如何转换已经在mongoDB中的时间戳:
db.collection.update({},
[
{
$addFields: {
"@timestamp": {
$dateFromString: {
dateString: {
$substr: [
"$@timestamp",
1,
23
]
}
}
}
}
}
],
{
multi: true
})
但是您需要修复注入并使用 logstash filter 以便将字符串中的日期转换为 ISODate() 中的日期:
filter {
date {
match => [ "logdate", "MMM dd yyyy HH:mm:ss", "MMM d yyyy HH:mm:ss", "ISO8601" ]
}
}
同时检查 here monggodb 输出插件:
等号 值类型是布尔值 默认值为假 如果为真,则将 MongoDB 中的 @timestamp 字段存储为 ISODate 类型而不是 ISO8601 字符串。
它没有更改过滤器,而是通过在 logstash 配置的输出 mongodb 上添加新字段来解决。该字段是 isodate => true.
output {
mongodb {
...
isodate => true
}
}
此字段在发送到 mongodb 时将 @timestamp 字段从字符串更改为 ISODate() 格式。如果您正在寻找 如何在 mongodb 中将时间戳更改为 ISODate(),@R2D2 在那里有答案。