Logstash詳解

logstash可以接收不同類型的元數據(input)

1.文件類型(file)

input{
    file{
        #path屬性接受的參數是一個數組,其含義是標明需要讀取的文件位置
        path => [‘pathA’,‘pathB’]
        #表示多就去path路徑下查看是夠有新的文件產生。默認是15秒檢查一次。
        discover_interval => 15
        #排除那些文件,也就是不去讀取那些文件
        exclude => [‘fileName1’,‘fileNmae2’]
        #被監聽的文件多久沒更新後斷開連接不在監聽,默認是一個小時。
        close_older => 3600
        #在每次檢查文件列 表的時候, 如果一個文件的最後 修改時間 超過這個值, 就忽略這個文件。 默認一天。
        ignore_older => 86400
        #logstash 每隔多 久檢查一次被監聽文件狀態( 是否有更新) , 默認是 1 秒。
        stat_interval => 1
        #sincedb記錄數據上一次的讀取位置的一個index
        sincedb_path => ’$HOME/. sincedb‘
        #logstash 從什麼 位置開始讀取文件數據, 默認是結束位置 也可以設置爲:beginning 從頭開始
        start_position => ‘beginning’
        #注意:這裏需要提醒大家的是,如果你需要每次都從同開始讀取文件的話,關設置start_position => beginning是沒有用的,你可以選擇sincedb_path 定義爲 /dev/null
    }           
}

2.數據庫類型

input{
    jdbc{
    #jdbc sql server 驅動,各個數據庫都有對應的驅動,需自己下載
    jdbc_driver_library => "/etc/logstash/driver.d/sqljdbc_2.0/enu/sqljdbc4.jar"
    #jdbc class 不同數據庫有不同的 class 配置
    jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"
    #配置數據庫連接 ip 和端口,以及數據庫   
    jdbc_connection_string => "jdbc:sqlserver://200.200.0.18:1433;databaseName=test_db"
    #配置數據庫用戶名
    jdbc_user =>   
    #配置數據庫密碼
    jdbc_password =>
    #上面這些都不重要,要是這些都看不懂的話,你的老闆估計要考慮換人了。重要的是接下來的內容。
    # 定時器 多久執行一次SQL,默認是一分鐘
    # schedule => 分 時 天 月 年  
    # schedule => * 22  *  *  * 表示每天22點執行一次
    schedule => "* * * * *"
    #是否清除 last_run_metadata_path 的記錄,如果爲真那麼每次都相當於從頭開始查詢所有的數據庫記錄
    clean_run => false
    #是否需要記錄某個column 的值,如果 record_last_run 爲真,可以自定義我們需要表的字段名稱,
    #此時該參數就要爲 true. 否則默認 track 的是 timestamp 的值.
    use_column_value => true
    #如果 use_column_value 爲真,需配置此參數. 這個參數就是數據庫給出的一個字段名稱。當然該字段必須是遞增的,可以是 數據庫的數據時間這類的
    tracking_column => create_time
    #是否記錄上次執行結果, 如果爲真,將會把上次執行到的 tracking_column 字段的值記錄下來,保存到 last_run_metadata_path 指定的文件中
    record_last_run => true
    #們只需要在 SQL 語句中 WHERE MY_ID > :last_sql_value 即可. 其中 :last_sql_value 取得就是該文件中的值
    last_run_metadata_path => "/etc/logstash/run_metadata.d/my_info"
    #是否將字段名稱轉小寫。
    #這裏有個小的提示,如果你這前就處理過一次數據,並且在Kibana中有對應的搜索需求的話,還是改爲true,
    #因爲默認是true,並且Kibana是大小寫區分的。準確的說應該是ES大小寫區分
    lowercase_column_names => false
    #你的SQL的位置,當然,你的SQL也可以直接寫在這裏。
    #statement => SELECT * FROM tabeName t WHERE  t.creat_time > :last_sql_value
    statement_filepath => "/etc/logstash/statement_file.d/my_info.sql"
    #數據類型,標明你屬於那一方勢力。單了ES哪裏好給你安排不同的山頭。
    type => "my_info"
    }
    #注意:外載的SQL文件就是一個文本文件就可以了,還有需要注意的是,一個jdbc{}插件就只能處理一個SQL語句,
    #如果你有多個SQL需要處理的話,只能在重新建立一個jdbc{}插件。
}

3.可以同時啓用多個端口,用來接收各個來源的log(搭配filebeat使用)

input {
  beats {
    id => "51niux_resin_log"
    port => 6043
    
  }
  beats{
    port => 6044
  }

  beats {
    type => 51niux_nginx_log
    id => "v3"
    port => 6045
  }
}

 

 

 

 

 

logstash 對數據的過濾(filter)

Logstash三個組件的第二個組件,也是真個Logstash工具中最複雜,最蛋疼的一個組件,當然,也是最有作用的一個組件。


1、grok插件

grok插件有非常強大的功能,他能匹配一切數據,但是他的性能和對資源的損耗同樣讓人詬病。

filter{
    
    grok{
        #只說一個match屬性,他的作用是從message 字段中吧時間給摳出來,並且賦值給另個一個字段logdate。
        #首先要說明的是,所有文本數據都是在Logstash的message字段中中的,我們要在過濾器裏操作的數據就是message。
        #第二點需要明白的是grok插件是一個十分耗費資源的插件,這也是爲什麼我只打算講解一個TIMESTAMP_ISO8601正則表達式的原因。
        #第三點需要明白的是,grok有超級多的預裝正則表達式,這裏是沒辦法完全搞定的,也許你可以從這個大神的文章中找到你需要的表達式
        #http://blog.csdn.net/liukuan73/article/details/52318243
        #但是,我還是不建議使用它,因爲他完全可以用別的插件代替,當然,對於時間這個屬性來說,grok是非常便利的。
        match => ['message','%{TIMESTAMP_ISO8601:logdate}']
    }

}

 2、mutate插件

mutate插件是用來處理數據的格式的,你可以選擇處理你的時間格式,或者你想把一個字符串變爲數字類型(當然需要合法),同樣的你也可以返回去做。可以設置的轉換類型 包括: "integer", "float" 和 "string"。

filter {
    mutate {
        #接收一個數組,其形式爲value,type
        #需要注意的是,你的數據在轉型的時候要合法,你總是不能把一個‘abc’的字符串轉換爲123的。
        convert => [
                    #把request_time的值裝換爲浮點型
                    "request_time", "float",
                    #costTime的值轉換爲整型
                    "costTime", "integer"
                    ]
    }
}

 3、ruby插件

官方對ruby插件的介紹是——無所不能。ruby插件可以使用任何的ruby語法,無論是邏輯判斷,條件語句,循環語句,還是對字符串的操作,對EVENT對象的操作,都是極其得心應手的。

filter {
    ruby {
        #ruby插件有兩個屬性,一個init 還有一個code
        #init屬性是用來初始化字段的,你可以在這裏初始化一個字段,無論是什麼類型的都可以,這個字段只是在ruby{}作用域裏面生效。
        #這裏我初始化了一個名爲field的hash字段。可以在下面的coed屬性裏面使用。
        init => [field={}]
        #code屬性使用兩個冒號進行標識,你的所有ruby語法都可以在裏面進行。
        #下面我對一段數據進行處理。
        #首先,我需要在把message字段裏面的值拿到,並且對值進行分割按照“|”。這樣分割出來的是一個數組(ruby的字符創處理)。
        #第二步,我需要循環數組判斷其值是否是我需要的數據(ruby條件語法、循環結構)
        #第三步,我需要吧我需要的字段添加進入EVEVT對象。
        #第四步,選取一個值,進行MD5加密
        #什麼是event對象?event就是Logstash對象,你可以在ruby插件的code屬性裏面操作他,可以添加屬性字段,可以刪除,可以修改,同樣可以進行樹脂運算。
        #進行MD5加密的時候,需要引入對應的包。
        #最後把冗餘的message字段去除。
        code => "
            array=event。get('message').split('|')
            array.each do |value|
                if value.include? 'MD5_VALUE'
                    then 
                        require 'digest/md5'
                        md5=Digest::MD5.hexdigest(value)
                        event.set('md5',md5)
                end
                if value.include? 'DEFAULT_VALUE'
                    then
                        event.set('value',value)
                end
            end
             remove_field=>"message"
        "
    }

4、date插件

這裏需要合前面的grok插件剝離出來的值logdate配合使用(當然也許你不是用grok去做)。

filter{
    date{
        #還記得grok插件剝離出來的字段logdate嗎?就是在這裏使用的。你可以格式化爲你需要的樣子,至於是什麼樣子。就得你自己取看啦。
        #爲什什麼要格式化?
        #對於老數據來說這非常重要,應爲你需要修改@timestamp字段的值,如果你不修改,你保存進ES的時間就是系統但前時間(+0時區)
        #單你格式化以後,就可以通過target屬性來指定到@timestamp,這樣你的數據的時間就會是準確的,這對以你以後圖表的建設來說萬分重要。
        #最後,logdate這個字段,已經沒有任何價值了,所以我們順手可以吧這個字段從event對象中移除。
        match=>["logdate","dd/MMM/yyyy:HH:mm:ss Z"]
        target=>"@timestamp"
        remove_field => 'logdate'
        #還需要強調的是,@timestamp字段的值,你是不可以隨便修改的,最好就按照你數據的某一個時間點來使用,
        #如果是日誌,就使用grok把時間摳出來,如果是數據庫,就指定一個字段的值來格式化,比如說:"timeat", "%{TIMESTAMP_ISO8601:logdate}"
        #timeat就是我的數據庫的一個關於時間的字段。
        #如果沒有這個字段的話,千萬不要試着去修改它。

    }
}

5、json插件

這個插件也是極其好用的一個插件,現在我們的日誌信息,基本都是由固定的樣式組成的,我們可以使用json插件對其進行解析,並且得到每個字段對應的值。

filter{
    #source指定你的哪個值是json數據。
    json {
         source => "value"
    }
    #注意:如果你的json數據是多層的,那麼解析出來的數據在多層結裏是一個數組,你可以使用ruby語法對他進行操作,最終把所有數據都裝換爲平級的。

}

json插件還是需要注意一下使用的方法的,下圖就是多層結構的弊端:

image

對應的解決方案爲:

ruby{
                code=>"
                  kv=event.get('content')[0]
                  kv.each do |k,v|
                  event.set(k,v)
                  end"
                  remove_field => ['content','value','receiptNo','channelId','status']
            }

Logstash filter組件的插件基本介紹到這裏了,這裏需要明白的是:
add_field、remove_field、add_tag、remove_tag 是所有 Logstash 插件都有。相關使用反法看字段名就可以知道。不如你也試試吧。。。。

 

 

 

 

 

輸出(output)

Logstash的output模塊,相比於input模塊來說是一個輸出模塊,output模塊集成了大量的輸出插件,可以輸出到指定文件,也可輸出到指定的網絡端口,當然也可以輸出數據到ES.
在這裏我只介紹如何輸出到ES,至於如何輸出到端口和指定文件,有很多的文檔資料可查找.

  elasticsearch{  
    hosts=>["172.132.12.3:9200"]  
    action=>"index"  
    index=>"indextemplate-logstash"  
    #document_type=>"%{@type}"  
    document_id=>"ignore"  
      
    template=>"/opt/logstash-conf/es-template.json"  
    template_name=>"es-template.json"  
    template_overwrite=>true       
    }

action=>”index” #es要執行的動作 index, delete, create, update
l index:將logstash.時間索引到一個文檔
l delete:根據id刪除一個document(這個動作需要一個id)
l create:建立一個索引document,如果id存在 動作失敗.
l update:根據id更新一個document,有一種特殊情況可以upsert--如果document不是已經存在的情況更新document 。參見upsert選項。
l A sprintf style string to change the action based on the content of the event. The value %{[foo]} would use the foo field for the action
document_id=>” ” 爲索引提供document id ,對重寫elasticsearch中相同id詞目很有用
document_type=>” ”事件要被寫入的document type,一般要將相似事件寫入同一type,可用%{}引用事件type,默認type=log
index=>”logstash-%{+YYYY,MM.dd}” 事件要被寫進的索引,可是動態的用%{foo}語句
hosts=>[“127.0.0.0”] ["127.0.0.1:9200","127.0.0.2:9200"] "https://127.0.0.1:9200"
manage_template=>true 一個默認的es mapping 模板將啓用(除非設置爲false 用自己的template)
template=>”” 有效的filepath 設置自己的template文件路徑,不設置就用已有的
template_name=>”logstash” 在es內部模板的名字
這裏需要十分注意的一個問題是,document_id儘量保證值得唯一,這樣會解決你面即將面臨的ES數據重複問題,切記切記!

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章