Logstash는 비정형화된 데이터를 마음대로 정형화 할 수 있습니다.
그러나 Logstash로 시간필드를 unixtimestamp로 만드려고 할 때 ms단위를 마음대로 빼고 파싱하는 등 불편한 경우가 생깁니다.
저의 경우엔 자주 부딪혔던 문제인데 막상 해당 문제에 대해 다룬 글을 찾기가 어려웠어서 다른 분들은 그런 일이 없길 바라면서 정리해두려 합니다.
임의의 시간 형식 -> iso8601형태로 정규화 -> ruby 필터를 통해 unixtimestamp(ms)로 파싱
filter {
if [boarding_time] {
date {
match => ["boarding_time", "yyyyMMddHHmmss"]
target => "@boarding_timestamp"
}
}
{
"boarding_time" => "20221022223057",
"@boarding_timestamp" => "2022-10-22T22:30:57.000Z"
}
ruby 로 timestamp를 가져와 정수형으로 바꾸면 unix_timestamp로 변환 되지만, second 단위까지만 파싱이 됩니다. ms 단위까지 파싱하기 위해서는 아래와 같이 작성하면 됩니다.
filter {
ruby {
code => '
timestamp = event.get("@timestamp")
timestamp_str = timestamp.to_s
ms = timestamp_str[-4..-2].to_i
event.set("@unix_timestamp", timestamp.to_i * 1000 + ms)
'
}
}
{
"@timestamp" => 2023-04-10T04:28:20.923Z,
"@unix_timstamp" => 1681100900923
}