1. 程式人生 > 其它 >外掛的內部實現_使用Logstash的ruby外掛實現複雜處理邏輯

外掛的內部實現_使用Logstash的ruby外掛實現複雜處理邏輯

技術標籤:外掛的內部實現

導讀:Logstash擁有許多的filter plugins 可相互配合進行資料處理,但是當遇到複雜的處理邏輯時部分外掛即便可以達到相同的處理效果,但在編寫時也可能會顯得比較吃力。這時候可以考慮使用 ruby外掛,通過編寫 ruby 指令碼實現輕鬆靈活處理複雜邏輯。本文將圍繞以下四點展開討論關於使用Logstash的ruby外掛實現複雜處理邏輯:

  • Ruby簡述
  • Logstash的ruby外掛
  • event概念
  • 使用ruby外掛實現複雜處理邏輯的demo

Ruby簡述

Ruby 一種簡單快捷的面向物件(面向物件程式設計)指令碼語言,在 20 世紀 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)設計並開發,Ruby是動態語言。

b753efe22708f5262d3668fd5722a3f7.gif

Ruby 安裝及語法學習地址,如下:

https://www.runoob.com/ruby/ruby-tutorial.html

可自己在平臺上搭建ruby開發環境,或者使用ruby線上程式設計測試網站,如下

http://www.dooccn.com/ruby/

Logstash的ruby外掛

Logstash在Filter plugins中提供了ruby plugin,支援通過內聯(inline)或者 ruby file形式。

c2b29ff8452e2bd52957cb6d7b07a8e7.png

內聯形式

    filter {      ruby {        # 在此處編寫直接編寫ruby程式碼        code => "event.cancel if rand <= 0.90"      }    }

ruby file形式

當代碼比較複雜時,採用內聯形式在文字字串中構造會顯得複雜和困難,因此最好將Ruby程式碼放在.rb檔案中,並通過 path 指定。

 filter {      ruby {        # path指定 ruby file所在路徑        path => "/etc/logstash/drop_percentage.rb"        script_params => { "percentage" => 0.9 }      }    }

在編寫 .rb 指令碼檔案時,應定義以下兩個方法:

  • register(params):一個可選
    的註冊方法,該方法接收自配置選項 script_params 傳遞進來的 key/value 。
  • filter(event):一個強制的Ruby方法,它接受Logstash event並必須返回event(注:在filter中,我們的引數就是input過來的每一條訊息,這個訊息在filter中被稱為event物件,關於event物件下文會進行詳細討論)。
def register(params)@drop_percentage = params["percentage"]enddef filter(event)if rand >= @drop_percentagereturn [event]elsereturn [] # return empty array to cancel eventendend

詳細關於ruby 外掛詳細描述可檢視官網地址,如下:

https://www.elastic.co/guide/en/logstash/7.1/plugins-filters-ruby.html#_description_134

Event

Event是在Logstash內部封裝資料流的主要物件,同時其為使用外掛的開發人員提供與事件(event)內容互動的API,其可以用於Ruby filter 進行資料檢索及轉換。Event物件包含傳送到Logstash的原始資料和在Logstash的過濾階段建立的任何其他欄位。因此當採用ruby外掛時,我們可以通過處理event物件實現資料處理。

# 獲取event.get(field)  # 設定event.set(field, value)
4f2009f4965b9e6dcc086ab89c22b67d.png

get 寫法

a428ed167280048b23e2ec6fa110b5e9.png

set 寫法

關於event api 的詳細應用可參考官方文件,如下:

https://www.elastic.co/guide/en/logstash/7.1/event-api.html#_event_object

一個簡單的Demo例子

編寫一個 logstash.conf 檔案,包含 input、filter 、output三部分

input {  file {     path => ["/data/nginx_logs/ods_media_show_log/access.log"]     type => "nginx"  }}filter {      kv {        field_split => "&?"      }      mutate{        split=>["message","/"]        add_field => {          "channel" => "%{[message][0]}"        }        remove_field => [ "message" ]      }     # ruby 外掛可以與其他filter外掛相結合      ruby {         path => "/usr/local/logstash/config/odsMediaShowLog.rb"      }}output {   stdout {}}

編寫ruby指令碼檔案

  • (可選)編寫register(params)
  • (必選)編寫filter(event),內部編寫對 event的處理邏輯
# 用於接收script_params傳遞過來的值,同時做一些宣告def register(params)          @MEDIA_TYPE_MAP = { "channel1" => 1, "channel2" => 2, "channel3" => 5 }end# 處理eventdef filter(event)        # 獲取event中channel欄位的值        channel = event.get("channel")        # 新增新欄位        event.set("media_type_id", @MEDIA_TYPE_MAP[channel])        # 如果沒有platform欄位,則返回空陣列,過濾掉該event        if event.get("platform").nil?                return []        end       #....... 其他複雜邏輯 end

通過藉助ruby外掛,我們可以通過編寫ruby file 從而更加簡便靈活地實現複雜處理邏輯。ruby外掛可以使用任何的ruby語法,包括如邏輯判斷,條件語句,迴圈語句,字串的操作等,十分方便。

總結

本文先簡單介紹了 Ruby語言、Logstash的ruby外掛、event 這個三個概念。並使用一個簡單的例子展示瞭如何通過 ruby 外掛實現複雜處理邏輯。logstash 擁有很多 filter 外掛,擁有強大的過濾功能,儘管ruby外掛很方便,但也需要一定的學習成本。要達到過濾目的方式有很多,我們應結合實際場景選擇最恰當的處理方式才是最好的方案。

感謝您的閱讀,如果喜歡本文歡迎關注和轉發,本頭條號將堅持持續分享IT技術知識。對於文章內容有其他想法或意見建議等,歡迎提出共同討論共同進步。