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{}}