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