Logstash的基本知識
Logstash是什麼
logstash是開源數據收集引擎,可以用數據的統一和擴充。
相關版本支持(看這裏)
工作原理(看這裏)
- 輸入
file:從文件系統上的文件讀取,非常類似於UNIX命令tail -0F
syslog:在知名端口514上偵聽syslog消息並根據RFC3164格式進行解析
redis:使用redis通道和redis列表從redis服務器讀取。Redis經常在集中式Logstash安裝中用作“代理”,該安裝會將來自遠程Logstash“託運人”的Logstash事件排隊。
beats:處理 Filebeat和其他beat發送的數據 - 過濾器(使用方式)
date:用於完成日期轉換,可以將日期類型的字符串生成爲一個新的字段,用以替代默認的
json:將字段內容轉爲JSON格式
grok:將符合某個正則規則的內容重新定義爲另一個字段中。Logstash預定義了很多的正則規則,通過這些文件還可以學習到很多正則高級寫法,這些規則存放在以下目錄:/usr/
local
/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns
mutate:該插件也是使用很頻繁的插件,可以對字段內容做處理,比如重命名,刪除,替換和修改事件中的字段。
dissect:基於分割符來切割字段,避免grok消耗CPU的問題,性能是grok的三倍左右。但是需要每行日誌格式相似,並有明顯的分割符
geoip:添加有關IP地址地理位置的信息(還在Kibana中顯示驚人的圖表!)
fingerprint :創建一個或多個字段的一致哈希(指紋),並將結果存儲在新字段中。 - 輸出
流行的Logstash輸出插件
file:輸出到文件
email:收到輸出時,它會根據某些條件發送電子郵件
elasticsearch:輸出到elasticsearch集羣,這是Logstash最常見和最推薦的輸出
stdout:標準輸出流
redis:事件寫入redis隊列,並用作許多ELK實現的代理
mongodb:輸出到mongodb
kafka:輸出到kafka topic - 編解碼器:
編解碼器基本上是流過濾器,可以作爲輸入或輸出的一部分進行操作。編解碼器使您可以輕鬆地將消息的傳輸與序列化過程分開。流行的編解碼器有:
json:以JSON格式編碼或解碼數據。
plain插件:主要用於事件之間沒有分隔的純文本。
multiline:將多行文本事件(例如java異常和stacktrace消息)合併爲一個事件。
執行模型
Logstash事件處理管道協調輸入,過濾器和輸出的執行。
Logstash在管道階段(輸入→過濾器和過濾器→輸出)之間使用內存中有界隊列來緩衝事件。爲了幫助防止數據丟失,可以持久隊列,將正在進行的事件持久保存到磁盤。死信隊列爲Logstash無法處理的事件提供磁盤存儲。默認情況下,死信隊列是禁用的。
Logstash配置文件
logstash.yml
包含Logstash配置標誌。您可以在此文件中設置標誌,而不是在命令行中傳遞標誌。您在命令行上設置的所有標誌都將覆蓋logstash.yml
文件中的相應設置。有關更多信息,請參見logstash.yml。
pipelines.yml
包含用於在單個Logstash實例中運行多個管道的框架和說明。有關更多信息,請參見多管道。
jvm.options
包含JVM配置標誌。使用此文件來設置總堆空間的初始值和最大值。您也可以使用此文件設置Logstash的語言環境。在單獨的行上指定每個標誌。此文件中的所有其他設置都被視爲專家設置。
log4j2.properties
包含log4j 2
庫的默認設置。有關更多信息,請參見Log4j2配置。
startup.options
(Linux)
在安裝Logstash軟件包時,system-install
腳本將在安裝過程結束時執行,並使用中指定的設置startup.options
來設置選項,例如用戶,組,服務名稱和服務描述。
Logstash.config(看這裏)
基本結構:
input {
插件{
具體插件配置,插件的配置包括插件名稱,後跟該插件的一組設置
name => value
}
}
filter {
插件{
具體插件配置
}
}
output {
插件{
具體插件配置
}
}
插件配置值的支持數據類型:
- Array:users => [ {id => 1, name => bob}, {id => 2, name => jane} ]
- Lists:path => [ "/var/log/messages", "/var/log/*.log" ]
- Boolean:ssl_enable => true
- Bytes:my_bytes => "1024" 表示1024個字節
- codec:codec => "json"
- Hash:match => { "field1" => "value1" "field2" => "value2" }
- Number:port => 33
- Password:my_password => "123456"
- URI:my_uri => "http://foo:[email protected]"
- Path:my_path => "/tmp/logstash"
- String:"直接就是一個字符串"
條件語句和臨時字段(看這裏)
- 使用if條件語句可以在特定條件下過濾或輸出事件,語法是:
if EXPRESSION { ... } else if EXPRESSION { ... } else { ... }
- 使用@metadata代表臨時字段,可用於條件語句中,該字段的值不會出現這結果集中
Logstash中的通信
同一個Logstash實例中連接多個管道的信息,請參閱多管道和管道到管道通信。
不同的Logstash實例之間建立通信,請使用Logstash到Logstash的通信,或使用中間隊列,例如Kafka或Redis。
利用X-Pack配置集中式管道管理
x-pack介紹,在logstash中的可行的配置,在Kibana中配置集中式管道管理