logstash grok 日志格式書寫方法


elk環境

 Elasticsearch + Logstash + Kibana +Redis +Filebeat

客戶端filebeat收集日志存到redis,logstash消費redis日志(按需要的格式)存儲到elasticsearch,kibana讀取elasticsearch索引數據。

正則表達式

1.正則表達式

普通正則表達式

. 任意一個字符

* 前面一個字符出現0次或者多次

[abc] 中括號內任意一個字符

[^abc] 非中括號內的字符

[0-9] 表示一個數字

[a-z]   小寫字母

[A-Z] 大寫字母

[a-zA-Z] 所有字母

[a-zA-Z0-9] 所有字母+數字

[^0-9] 非數字

^xx 以xx開頭

xx$ 以xx結尾

\d 任何一個數字

\s 任何一個空白字符

擴展正則表達式,在普通正則符號再進行了擴展

? 前面字符出現0或者1次

+ 前面字符出現1或者多次

{n} 前面字符匹配n次

{a,b} 前面字符匹配a到b次

{,b} 前面字符匹配0次到b次

{a,} 前面字符匹配a或a+次

(string1|string2) string1或string2

 

 

在Kibana的grokdebugger上進行測試

當寫入logstash.conf之前可在Kibana的grokdebugger上進行測試:

192.168.237.1 - - [24/Feb/2019:17:48:47 +0800] "GET /shijiange HTTP/1.1" 404 571 “http://www.baidu.com/tieba/wooo” "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"

那么可以按照正則表達式和grok語法在grokdebugger進行如下測試:

 

 (?<clientip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) - - \[(?<requesttime>[^ ]+ \+[0-9]+)\] "(?<requesttype>[A-Z]+) (?<requesturl>[^ ]+) HTTP/\d.\d" (?<status>[0-9]+) (?<bodysize>[0-9]+) "(?<http_referer>[^" ]+)" "(?<ua>[^"]+)

*注意: 當Simulate沒有輸出時,先查看log出輸出的格式,一定要注意字段之間的空格。

(?<字段名>正則)表示將匹配的內容提取為字段,其他不用提取為字段的地方原樣寫上或者用正則匹配即可。

可以參考nginx日志格式

log_format nginx         '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
                                    '$status $body_bytes_sent "$http_referer" '
                                    '"$http_user_agent"';

注意換行” ‘之間的空格。 

最后再寫入到logstash.conf.

input {
    redis {
            host => "192.168.3.9"
            port => 6379
            key => "messages"
            data_type => "list"
            db => 0
     }
}

filter{
       grok {
                 match => {
"message" => '(?<clientip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) - - \[(?<requesttime>[^ ]+ \+[0-9]+)\] "(?<requesttype>[A-Z]+) (?<requesturl>[^ ]+) HTTP/\d.\d" (?<status>[0-9]+) (?<bodysize>[0-9]+) "(?<http_referer>[^" ]+)" "(?<ua>[^"]+)'

      }
                 remove_field => ["message"]
}
                  geoip {
                          source => ["ip"]
                          target => ["geoip"]
                          fields => ["city_name","region_name","country_name","ip"]
    }

}
output {
      if [fields][log_source] == 'messages' {
           elasticsearch {
                hosts => ["http://127.0.0.1:9200"]
                index => "filebeat-message-%{+YYYY.MM.dd}"
                user => "elastic"
                password => "123456"
          }
      }
}

參考鏈接:https://www.cnblogs.com/yanshaoshuai/p/11386442.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM