ELK之Logstash配置方法

Logstash                                                                                                                                           
#############################logstash命令常用參數#############################

-n 指定logstash實例名稱,如果沒有指定,默認是本地主機名
-f 從指定的文件或文件夾中加載logstash的配置;如果是一個文件夾,它會加載裏面所有的文件,或者可以加上通配符只加載特定格式的文件
-w 允許filter和output的pipeline線程數量,默認是CPU核數
-b 每個 Logstash pipeline 線程,在執行具體的 filter 和 output 函數之前,最多能累積的日誌條數,默認是 125 條。越大性能越好,同樣也會消耗越多的 JVM 內存
-u 每個 Logstash pipeline 線程,在打包批量日誌的時候,最多等待幾毫秒。默認是 5 ms
-l 指定日誌輸出位置
-r 監控配置配置文件,如果有變化則自動重載logstash
-e 使用給定的命令行字符串作爲配置,直接運行bin/log/logstash -e 配置默認是"input { stdin { type => stdin } }" "output { stdout { codec => rubydebug } }"
-t 檢查配置文件是否有語法錯誤
-V 打印logstash版本
--log.level 指定日誌等級,包括trace、debug、info、warn、error、fatal,默認info
--http.host 指定web API綁定的主機,默認127.0.0.1
--http.port 指定web API的http端口,默認9600至9700


#############################後臺啓動logstash#############################
1.安裝supervisor

yum -y install supervisor --enablerepo=epel

2.在/etc/supervisord.conf配置文件最後添加:

[program:logstash]
directory=/usr/local/logstash
command=/usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/conf.d/ -r -l /var/log/logstash

3.啓動

service supervisord start

4.單獨控制一個子進程

supervisorctl stop logstash


#############################編解碼配置插件#############################
#官網參考:https://www.elastic.co/guide/en/logstash/current/codec-plugins.html
#logstash不只是一個input|filter|output的數據流,而是一個input|decode|filter|encode|output的數據流。codec就是用來decode、encode事件的。
1.JSON編解碼
#直接輸入預定義好的JSON數據,可以省略filter/grok配置,降低logstash過濾的CPU負載消耗

input {
    file {
        path => "/opt/data/logs/bjape01-ngx-a1-172.16.3.2/nginx_access.log"
        codec => "json"
    }
}

2.multiline多行事件編碼

codec => multiline {
    pattern => "^\["
    negate => true
    what => "previous"
}

#pattern 要匹配的正則表達式,字符串類型
#negate  正則表達式是否生效,布爾類型,默認爲flase
#what 未匹配的內容是向前合併還是向後後合併,previous,next兩個值選擇
#示例配置可以用於Log4j方式的應用程序日誌

3.line面向行的文本數據

4.plain空的純文本編解碼
#使用已經有定義框架輸入或輸出,例如logstash輸出轉存到elasticsearch

output {
        if [type] == "user_audit" {
            elasticsearch {
                            hosts => ["172.16.1.25","172.16.1.26","172.16.1.27"] 
                            index => 'user_audit-%{+YYYY-MM-dd}'
                            codec=>plain{charset=>"UTF-8"}
                          }
                    }
        }


#############################輸入插件#############################
#官網參考:https://www.elastic.co/guide/en/logstash/current/input-plugins.html
1.標準輸入
示例:

input {
    stdin {
        add_field => {"key" => "value"}
        codec => "plain"
        tags => ["add"]
        type => "std"
    }
}

#add_field 向事件添加一個字段,hash類型
#codec 設置編碼方式,默認是line
#tags 添加標記
#type 添加類型

2.文件輸入

input {
    file {
        path => [
                "/opt/data/logs/idca-web1-172.16.3.2/apache_access.log",
                "/opt/data/logs/idca-web1-172.16.3.2/apache_error.log"
                ]
        stat_interval => 1
        discover_interval => 1
        type => "apache_log"
    }
}

#path 處理的文件的路徑, 可以定義多個路徑
#stat_interval 每隔多久檢查一次被監聽文件狀態(是否更新),默認是1秒
#discover_interval 每隔多久去檢查一次被監聽的path下是否有新文件,默認是15秒
#start_position 從什麼位置開始讀取文件數據,"beginning"從頭開始讀取,讀到最後一行不會終止,繼續tailf;"end"從結束位置tailf。默認值是"end"
    #坑:start_position僅在該文件從未被監聽過的時候起作用,如果sincedb文件中已經有這個文件的inode記錄了,那麼logstash依然會衝記錄過的pos開始讀取數據。所以重複測試的時候每回需要刪除sincedb文件,該文件一般在安裝目錄下的data/plugins/inputs/file/中
    #優化:在file中添加sincedb_path => "/dev/null",可以直接將sincedb寫到黑洞中
#exclude 不想被監聽的文件可以排除出去
#sincedb_path 配置sincedb文件位置
#sincedb_write_interval 每隔多久寫一次sincedb文件,默認15秒

3.syslog輸入

input {
    syslog {
        port => "514"
    }
}


4.collectd輸入

#############################過濾器配置#############################
#官網參考:https://www.elastic.co/guide/en/logstash/current/filter-plugins.html
1.grok正則捕獲
#用於匹配對應格式的message,然後過濾出來

filter {
  grok {
    break_on_match => false
    patterns_dir => ["/usr/local/logstash/etc/conf.d/patterns"]
    match => { "message" => "\[%{TIMESTAMP_ISO8601:time}\] \[%{GLASSFISHVERSION:gfversion}\] %{OTHER}"}
  }
   grok {
    break_on_match => false
    patterns_dir => ["/usr/local/logstash/etc/conf.d/patterns"]
    match => {"path" => "/%{USER}/%{USER}/%{USER}/%{USER:host}/%{OTHER}" }
    overwrite => [ "host" ]
  }
}

#break_on_match 表示匹配即停止,默認爲true,如果希望grok嘗試所有模式,設置爲false
#patterns_dir 將grok表達式統一寫到文件中,該選項指定文件目錄。grok表達式可以寫到配置文件中,但是日誌格式可能有多種,每種都寫一行自己的表達式就可能會出問題,所以建議將所有的grok表達式統一寫到一個地方。

#grok表達式格式:

USERNAME [a-zA-Z0-9._-]+
USER %{USERNAME}
#第一行用普通的正則表達式來定義一個grok表達式;第二行用以定義好的grok表達式來定義另一個grok表達式。logstash內置了多種grok表達式,查看https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns,同樣可以自定義grok表達式。
%{NUMBER:num}
%{NUMBER:num:int}
#grok表達式的打印複製格式,第一行中NUMBER表示匹配的模式,num是匹配內容的標識,代表匹配的內容;第二行中int表示轉換匹配內容的格式,默認是字符串格式。

#overwrite用來重寫message字段,上面例子第二個grok中match的是一個路徑,但是我們只想保留路徑中的一個host字段,所以overwrite => [ "host" ]就可以了
 
2.date時間處理
#日誌產生到logstash處理一般都會有一段時間差,導致logstash實際處理時間都比日誌產生時間晚。logstash-filter-date插件可以解析日誌中的時間,變成LogStash:Timestamp對象,然後轉存到@timestamp字段裏,作爲事件的時間戳;如果未使用date插件或沒有解析到時間,logstash將使用日誌輸入的時間作爲事件的時間戳。

date {
      match => [ "time", "MMM dd yyyy HH:mm:ss",
            "MMM  d yyyy, HH:mm:ss", "ISO8601" ]
    }

#配置選項包括:locale、match、tag_on_failure、target、timezone。常用的是match,值的類型同樣是列表,默認是[]
#實例中的time就是grok中匹配字段的標識,由我們自定義。
#date插件支持五種時間格式,常用的是ISO8601和Joda-Time庫

ISO8601:類似"2018-10-19T14:25:25.905+0800",這是我們的北京時間,如果是UTC時間後面跟的是一個大寫的Z(時區偏移),nginx、apache、java應用都可以設置爲這種格式。
UNIX:UNIX時間戳格式,記錄從1970年起至今的總秒數。
UNIX_MS:從1970年至今的總毫秒數。
TAI64N:tai64n格式,很少用。
Joda-Time庫:y年,yyyy例如2018,yy例如18;M月,MMMM例如January,MMM例如Jan,MM例如01,M例如1;d日,dd例如01,d例如1;H時,HH例如01,H例如1;m分,mm例如01,m例如1;s秒,ss例如01,s例如1


#############################輸出插件#############################
#官網參考:https://www.elastic.co/guide/en/logstash/current/output-plugins.html
1.輸出到Elasticsearch

output {
    elasticsearch {
        hosts => ["172.16.1.25","172.16.1.26","172.16.1.27"]
        index => "%{type}-%{+YYYY-MM-dd}"
        codec=>plain{charset=>"UTF-8"}
    }
}

#hosts Elasticsearch地址,列表形式,可以寫多個。
#index 索引名,寫入Elasticsearch索引的名稱,可以使用變量。注意:%{+YYYY-MM-dd}}在語法解析時,看到已+開頭的,就會自動認爲後面是時間格式,所以之前處理過程中不要給自定義字段取加號開頭的名字;索引名中不要有大寫字母,否則Elasticsearch會報InvalidindexNameException





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