如何将数据类型从 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
 })

playground

但是您需要修复注入并使用 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 在那里有答案。