iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 15
0
自我挑戰組

30天 Docker E.L.K stack 系列 第 15

Day15 - DataTable

  • 分享至 

  • xImage
  •  

好了我來還債了,我們繼續來看看 kibana visualize 還有什麼可以提供的。

  • DataTable

Data table 可以用表格的方式提供我們比較多個屬性的方式,並依據我們設定的過濾順序來顯示資料,值得一提的是在新版的 kibana 介面可以直接用拖拉的方式改變排序的順序。接下來我們來試著以 data table 觀察 error log 的 level 與 host ip 間的關係,你可以參考以下設定配置啟動你的 docker logstash。

  • docker-compose.yml

    version: '2'
      services:
        elasticsearch:
          build: elasticsearch/
          ports:
            - "9200:9200"
            - "9300:9300"
          environment:
            ES_JAVA_OPTS: "-Xms1g -Xmx1g"
          networks:
            - docker_elk
        logstash:
          build: logstash/
          command: -f /etc/logstash/conf.d/
          volumes:
            - ./logstash/config:/etc/logstash/conf.d
          ports:
            - "5000:5000"
            - "5001:5001"
          networks:
            - docker_elk
          depends_on:
            - elasticsearch
        kibana:
          build: kibana/
          volumes:
            - ./kibana/config/:/etc/kibana/
          ports:
            - "5601:5601"
          networks:
            - docker_elk
          depends_on:
            - elasticsearch
    
      networks:
        docker_elk:
          driver: bridge
    
  • logstash.conf

        input {
            tcp {
                    port => 5000
                    type => "access"
            }
    
            tcp {
                    port => 5001
                    type => "error"
            }
    }
    
    filter {
            if [type] == "access" {
                    grok {
                            match => [
                                    "message", "%{HOSTNAME:ip_host} - - \[%{HTTPDATE:logDate}\] \"%{WORD:method} (?:%{URIPATHPARAM:url}|%{DATA:url}) HTTP/%{NUMBER:httpversion}\" %{WORD:response} (?:%{NUMBER:bytes}|-)"
                            ]
                    }
    
                    date {
                            match => ["logDate","dd/MMM/yyyy:HH:mm:ss Z"]
                    }
            }
    
            if [type] == "error" {
                    grok {
                            match => [
                                    "message", "\[%{DAY:day} %{MONTH:month}  %{INT:date} %{TIME:time} %{YEAR:year}\] (?:\[%{LOGLEVEL:level}\]|-) (?:\[client %{IP:ip_host}\]|-) (?:\(%{INT:error_code}\)|-)%{GREEDYDATA:content}",
                                    "message", "\[%{DAY:day} %{MONTH:month}  %{INT:date} %{TIME:time} %{YEAR:year}\] (?:\[%{LOGLEVEL:level}\]|-) (?:\[client %{IP:ip_host}\]|-) %{GREEDYDATA:content}",
                                    "message", "\[%{DAY:day} %{MONTH:month}  %{INT:date} %{TIME:time} %{YEAR:year}\] (?:\[%{LOGLEVEL:level}\]|-) %{GREEDYDATA:content}",
                                    "message", "\[%{DAY:day} %{MONTH:month}  %{INT:date} %{TIME:time} %{YEAR:year}\] %{GREEDYDATA:content}"
                            ]
                            add_field => {
                                    "logDate" => "%{date} %{month} %{year} %{time}"
                            }
                            remove_field => [ "day", "month", "date", "time", "year" ]
                    }
    
                    date {
                            match => ["logDate","dd MMM yyyy HH:mm:ss"]
                    }
            }
    }
    
    output {
    
            stdout { codec => rubydebug }
    
            if "_grokparsefailure" not in [tags] {
                    elasticsearch {
                                    hosts => "elasticsearch:9200"
                    }
            }
    }
    

簡單講解一下 logstash 的內容,docker-compose.yml 增加 logstash 監聽的 port 5001,並在 logstash.conf input 的部分加入以 port 5001 接收 error log 的接口。雖然你看到 filter 的設定看似複雜,其實他僅是依據我們接收到兩種不同性質的 log type 進行不同過濾而已,至於實際 grok 過濾的方式你可以善用 grokdebug 多作嘗試。

資料切割完成我們便可以快速地來產生表格囉

  1. 計算總數
    http://ithelp.ithome.com.tw/upload/images/20170101/201034204Ys2owQc2b.png
  2. 加入我們要觀察的屬性 level
    http://ithelp.ithome.com.tw/upload/images/20170101/20103420eksxxry1qI.png
  3. 在依據 level 增加過濾條件 ip_host
    http://ithelp.ithome.com.tw/upload/images/20170101/20103420yBoVT5w0Sj.png
  4. 完成
    http://ithelp.ithome.com.tw/upload/images/20170101/20103420nJ6pd46ARt.png

若是你僅想簡單的呈現 level 的計數你可以忽略步驟3.,或你已經完成至步驟4.時你可以按下 Disable aggregation 來暫時取消聚合。
http://ithelp.ithome.com.tw/upload/images/20170101/2010342090z6wH2bjt.png

http://ithelp.ithome.com.tw/upload/images/20170101/20103420SnrwSL8FFW.png


上一篇
Day14 - Visualize data with area chart. Markdown your document.
下一篇
Day16 - Visualize data with pie chart. Count by metric.
系列文
30天 Docker E.L.K stack 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言