Menu

Thursday, May 16, 2019

[ELK - Logstash] วิธีการ parse ข้อความ Log ที่มีหลายรูปแบบ โดยใช้ GROK
[ELK - Logstash] How to Parse Multiple Log Message by Using GROK

สำหรับการ parse ข้อความโดย GROK คุณต้องเพิ่ม grok filter ตามตัวอย่างด้านล่าง (อ้างอิงจาก https://www.elastic.co/guide/en/logstash/2.1/plugins-filters-grok.html#plugins-filters-grok-match)

สำหรับรายละเอียดของ GROK patterns อ่านได้ที่ https://github.com/elastic/logstash/blob/v1.4.0/patterns/grok-patterns

คุณสามารถทดสอบ pattern ที่คุณสร้างขึ้นกับข้อความจริง ได้ที่ https://grokdebug.herokuapp.com/

ตัวอย่างของการตั้งค่า Logstash เป็นตามด้านล่าง
input {
    beats {
        ssl => false
        host => "0.0.0.0"
        port => 5044
    }
}
filter {
    grok {
        match => {
            "message" => [
                "\[%{TIMESTAMP_ISO8601:timestamp}\] %{WORD:log_type}.%{LOGLEVEL:log_level}: %{DATA:request_id} %{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:response_code} %{NUMBER:duration} %{GREEDYDATA:message}",
                "\[%{TIMESTAMP_ISO8601:timestamp}\] %{WORD:log_type}.%{LOGLEVEL:log_level}: %{DATA:request_id} %{GREEDYDATA:message}"
            ]
        }
    }
}
output {
    elasticsearch {
        hosts => ["127.0.0.1:9200"]
        index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
    }
}
จากตัวอย่าง...

ในส่วนของ input ระบุให้รอรับข้อความที่ port 5044 ด้วย beat protocol (กรณีนี้ เราใช้ filebeat ในการส่งข้อความ input)

ในส่วนของ filter ระบุให้ใช้ grok เพื่อเปรียบเทียบและตัดข้อความ log โดยรูปแบบของ pattern คือ %{GROK_PATTERN:VARIABLE_NAME}.

ในส่วนของ output ระบุให้ส่ง output ไปยัง elasticsearch ที่ 127.0.0.1:9200 ด้วย index ที่ระบุ

No comments:

Post a Comment