Logstash基本plugin

前言

  • 在前面的2篇筆記中我們介紹了基本的原理以及基本的安裝
  • 這篇筆記會著重在Logstash的conf檔設定與filter的解析

Logstash parser = Input + Filter + Output

  • example:
    Input{stdin{}}
    Filter{grok{....}}
    Output{stdout{}}
    

Input

  • 常見會使用的有stdin, file, redis,kafka等….,詳細的內容可以參考elastic.co,裡面有更完整的說明以及參數使用方式。

Output

  • 常見會使用的有stdout, Elasticsearch, file,redis, kafka, csv等…,詳細的內容可以參考elastic.co,裡面有更完整的說明以及參數使用方式。

Filter

  • 常見的有Grok, Json, Kv, Csv, Mutate, Translate,詳細的內容可以參考elastic.co,裡面有更完整的說明以及參數使用方式。

Grok

  • 適用於正規表示法解析log
  • 亦可用grok本身的語法(前人將正規表達式包好了),可參考grokdebug
  • example1正規表達式: 輸入begin 123.456 end 抓出request time 是 123.456
    input{stdin{}}
    filter{
          grok{
                maatch => {
                            "message" => "\s+(?<request_time>\d+(?:\.\d+)?)\s+"
                }
          }
    }
    output{stdout{}}
    

    結果: show 一串資料其中有request_time這個屬性其值為123.456

  • example2grok語法
    • 題目:
      {"log":"==== start ====datetime: 2021/09/30 13:56:19||service: MBM||return_code: 0000||return_desc: XXX||txn_seq: 序號||channel: MB||id_no: ||pod:MBM0005001uehakgjhaouhodhe||server_host: 10.13.0.0 ||elapsed: 0001||request: {\"HEADER\":{\"TX_SN\":\"123\",\"USER_IP\":\"10.13.102.104\",\"CHANNEL_CODE\":\"MB\",\"TX_ID\":\"MBM081018\",\"SESSION_ID\":\"\",\"MAC_VALUE\":\"334DE540-268D-4FF6-8B7B-614373B9987B\",\"DEVICE_VERSION\":\"14.0\",\"MB_APP_VERSION\":\"7.1.1\",\"DEVICE_TYPE\":\"iOS\",\"DEVICE_UUID\":\"02dda815e166d25f37fa5c0f6acbb577a0710e10\",\"DEVICE_BRAND\":\"iPhone10,4\",\"HOST_TX_SN\":\"\",\"RETURN_CODE\":\"MBM0000\",\"RETURN_MESSAGE\":\"Success\"},\"BODY\":{\"CCY_NAME\":\"USD\"}}||response: {\"HEADER\":{\"TX_SN\":\"123\",\"USER_IP\":\"10.13.102.104\",\"CHANNEL_CODE\":\"MB\",\"TX_ID\":\"MBM081018\",\"SESSION_ID\":\"\",\"MAC_VALUE\":\"334DE540-268D-4FF6-8B7B-614373B9987B\",\"DEVICE_VERSION\":\"14.0\",\"MB_APP_VERSION\":\"7.1.1\",\"DEVICE_TYPE\":\"iOS\",\"DEVICE_UUID\":\"02dda815e166d25f37fa5c0f6acbb577a0710e10\",\"DEVICE_BRAND\":\"iPhone10,4\",\"HOST_TX_SN\":\"\",\"RETURN_CODE\":\"MBM0000\",\"RETURN_MESSAGE\":\"Success\"},\"BODY\":{\"UPDATE_TIME\":\"2021/09/30 13:56:06\",\"FX_RATE\":[{\"CCY_NAME\":\"USD\",\"CCY_CNAME\":\"美金\",\"SPOT_BUY_RATE\":\"27.6670\",\"SPOT_SELL_RATE\":\"27.7670\",\"SPOT_BUY_DIFFERENCE\":\"0.0000\",\"SPOT_SELL_DIFFERENCE\":\"0.0000\",\"CSH_BUY_LCY\":\"27.4760\",\"CSH_BUY_LCY_DIFFERENCE\":\"0.0000\",\"CSH_SELL_LCY\":\"27.9530\",\"CSH_SELL_LCY_DIFFERENCE\":\"0.0000\",\"IS_DAY30_BUY_HIGHEST\":false,\"IS_DAY7_BUY_HIGHEST\":true,\"IS_DAY30_SELL_LOWEST\":false,\"IS_DAY7_SELL_LOWEST\":true}]}}\n","stream":"stdout","time":"2021-09-30T05:56:19.894926514Z"}
      
  •   filter{
          grok{
                  match=> {
                          "message"=>"%{DATESTAMP:datetime}\|\|%{DATA} %{DATA:service}\|\|%{DATA} %{DATA:return_code}\|\|%{DATA} %{DATA:return_desc}\|\|%{DATA} %{DATA:txn_seq}\|\|%{DATA} %{DATA:channel}\|\|%{DATA}\|\|%{DATA} %{DATA:server_host}\|\|%{DATA}\|\|%{DATA} %{DATA:request_json}\|\|%{DATA} %{DATA:response_json} "}
          }
      }
    

Json

  • 使用情境: 解析json格式的data
  • example: 輸入{"uid":3081609001,"type" : "signal"}
    input{stdin{}}
    filter{
          json{
                  source => "message"
                  target => "jsoncontent"
          }
    }
    output{stdout{}}
    

    將source 轉換成json格式的target,target可要可不要

Kv

  • 使用情境: 解析key-value格式的data
  • example: 輸入name=Rick&age=21&src_from=Hsinchu
    input{stdin{}}
    filter{
          kv{
                  source => "message"
                  field_split => "&"
                  value_split => "="
          }
    }
    output {stdout{}}
    

CSV

  • 使用情境csv格式的log
  • example: 輸入 10.116.14.201,-,2/25/2016,11:53:17,W3SVC7,2132,200,0,GET
    input{stdin{}}
    filter{
          csv{
          source => "message"
          separator => ","
          columns => ["ip","a","date","time","b","latency","size","method"]
          }
    }
    output{stdout{}}