การอ่านค่า datetime ด้วย logstash

Prawit Tangmanopeanchai
1 min readJun 29, 2019

--

ข้อมูล datetime เป็นส่วนที่สำคัญมากเนื่องจากเราต้องใช้เพื่อดูช่วงเวลาของเหตุการณ์ที่เกิดขึ้น

เมื่อเรามีข้อมูลจาก log มาจากหลายที่ log แต่ละตัวเองก็มีรูปแบบของ date ไม่เหมือนกัน เราลองมาดูวิธีการจัดการ date ในรูปแบบต่าง ๆ กัน

รูปแบบที่ 1

2018–08–30T18:19:44.978272+07:00

ข้อมูล datetime นี้ได้มาจาก log ของ mysql เป็น datetime ตามมาตรฐาน ISO8601 สามารถอ่านได้โดยใช้ grok pattern ดังนี้

filter {
grok {
match => { "message" => "^%{TIMESTAMP_ISO8601:timestamp} %{NOTSPACE:name} %{WORD:level} %{SPACE} %{GREEDYDATA:message}$" }
overwrite => [ "message" ]
}
}ี้

หลังจากอ่านได้แล้วเราจะได้ค่า timestamp อยู่ใน field ชื่อว่า “timestamp” แต่ค่านี้จะเป็นค่าชนิด string ไม่สามารถนำไปจัดการแบบ datetime ได้ ดังนั้นเราจะต้องแปลงค่านี้ให้เป็น date โดยการใช้ filter date ดังนี้

filter {
date {
match => [ "timestamp", ISO8601 ]
}
}

หลังจากเราแปลงแล้วค่าของ “@timestamp” จะเปลี่ยนเป็นค่าตามที่เราแปลงด้วย หากเราต้องการเก็บค่า “@timestamp” ของเดิมเก็บไว้ เราจะต้องแปลงโดยให้ logstash ไปสร้างเป็น field ใหม่ ยกตัวเองเช่น

filter {
date {
match => [ "timestamp", ISO8601 ]
target => "target_timestamp"
}
}

จะทำให้ค่า “@timestamp” ยังเป็นค่าเดิม ส่วนค่าของ timestamp ของข้อมูลจะไปอยู่ที่ field “target_timestamp”

รูปแบบที่ 2

07/Mar/2004:16:05:49 -0800

รูปแบบนี้ได้มาจาก access log ของ apache ซึ่งสามารถใช้ pattern “HTTPDATE” ได้เลย แล้วสามารถแปลงเป็น timestamp ได้ดังนี้ (dd/MMM/yyyy:HH:mm:ss Z”)

รูปแบบที่ 3

2018–09–24 04:02:08.251

เป็นรูปแบบที่ได้จาก log ของ vertica ซึ่งเป็นมาตรฐาน ISO8601 สามารถใช้ตามรูปแบบที่ 1 ได้เลย

--

--

Prawit Tangmanopeanchai
Prawit Tangmanopeanchai

Written by Prawit Tangmanopeanchai

Head of Cloud Implementation Unit at gosoft (Thailand)

No responses yet