로그스태시는 비정형화된 데이터를 마음대로 정형화 할 수 있습니다.
그러나 로그스태시로 의외로 시간필드를 조작하려고 할 때 Ruby
의 time
객체와
Logstash
의 time
객체가 달라 난감한 상황을 맞이하는 경우가 종종 생깁니다.
원하는 형태로 가공하기 위해서는 그냥 문자열 형태로 파싱해서 다시 계산해주는게 가장 편리합니다.
오늘은 그 중 @timestamp
필드에 iso8601형태로 들어온 값을 unix_timestamp로 변경할 것입니다.
만약 @timestamp
의 값을 파싱하여 @unix_timestamp
필드를 추가하려면 다음 conf처럼 작성하면 됩니다.
input{
# 원하는 input 선택하여 작성
}
filter {
mutate {
add_field => {"@temp" => "%{@timestamp}"}
convert => {"@temp" => "string"}
}
ruby {
code => "temp = event.get('@temp')[-4..-2].to_i
event.set('@unix_timestamp', event.get('@timestamp').to_i * 1000 + temp)"
remove_field => ["@temp"]
}
}
output{
# 원하는 output 선택하여 작성
# 현재는 결과를 찍기 위하여 stdout으로 작성
if 1==1{ stdout { codec => rubydebug { metadata => true } }}
}
if [boarding_time] {
date {
match => ["boarding_time", "yyyyMMddHHmmss"]
target => "@tmp_boarding_time"
add_field=> {"@boarding_time" => ""}
}
ruby {
code => "event.set('@boarding_time', event.get('@tmp_boarding_time').to_i)"
remove_field => ["@tmp_boarding_time"]
}
}
{
"@timestamp" => 2023-04-10T04:28:20.923Z,
"@unix_timstamp" => 1681100900923
}
{
"boarding_time": "20221022223057",
"@boarding_time": 1569900034,
}