目錄html
logstash依賴java 8或 java 11,也可使用OpenJDK,在進行安裝時,咱們須要聲明JAVA_HOME的環境變量,以保證正常地安裝。這裏咱們採用OpenJDK的方式,更爲簡潔。java
[root@elk ~]# java -version openjdk version "1.8.0_222" OpenJDK Runtime Environment (build 1.8.0_222-b10) OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
YUM安裝方式:node
# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch #增長logstash源到yum倉庫/etc/yum.repos.d/ [logstash-6.x] name=Elastic repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md # yum install logstash
Logstash的工做原理圖:redis
標準的輸入輸出測試:數據庫
/usr/share/logstash/bin/logstash -e 'input {stdin {} } output { stdout {} }' hello
Logstash進行數據採集和流水線處理主要有三個步驟:inputs --> filters --> outputsjson
inputs負責定義數據採集的來源,filters進行自定義的過濾日誌的規則,outputs是將日誌輸出到日誌的存儲區域,如elasticsearch存儲。vim
inputs和outputs都支持對數據的格式進行編碼和解碼操做。ruby
Inputsbash
inputs支持多種數據採集的方式,經常使用的方式有如下幾種:服務器
file:直接讀取日誌文件,相似命令行執行tailf查看日誌
syslog:經過514端口進行監聽syslog日誌信息
redis:從redis服務器集羣中讀取日誌,redis一般會做爲一箇中間運輸層,以下降logstash日誌處理的壓力
beats:是一種輕量級的日誌收集方式
Filters
Filters是logstash日誌收集中的過濾處理層,經常使用的過濾器包含如下幾種:
grok:解析和構建任意文本,通俗地說就是將非結構化的日誌進行定義成結構化的格式
mutate:對日誌的字段進行修改,替換和刪除
drop:對日誌進行刪減部分
clone:對日誌進行復制,能夠是增長或者是刪除操做
geoip:添加ip的地理位置信息,用於在kibana的圖表統計信息,能夠看到訪問的區域分佈
Outputs
Outputs是Logstash收集的最後一個環節,一般將前面收集的日誌進行過濾規則之後再統一輸出到存儲區域。一般存儲區包含如下幾種:
elasticsearch:將收集到的數據發送到elasticsearch,其能夠提供高效方便的格式化查詢
file:將日誌數據存儲在文件當中
graphite:將日誌存儲到開源的時序數據庫graphite當中,存儲和聚合監控數據並繪製圖表
statsd:這是一個監聽服務,相似redis的使用,屬於一箇中間緩衝層,結合graphite一塊兒使用
Codecs
Codecs是在輸入和輸出層的一個文本格式的編碼器,支持json,msgpack和各類文本格式,如txt
json:對數據進行編碼和解碼成json格式
multiline:將多行的文本進行合併成單行的文本格式進行輸出
在經過RPM包安裝Logstash後,咱們能夠看到有不少目錄,一般瞭解一個軟件的使用,對目錄的使用瞭解也是很是有必要的,能夠加深對Logstash設計的理解,其結構以下:
類型 | 描述 | 默認值 | 如何定義配置 |
---|---|---|---|
home | logstash安裝的默認主目錄 | /usr/share/logstash | |
bin | logstash的二進制腳本程序和logstash-plugin插件安裝腳本 | /usr/share/logstash/bin | |
settings | 配置文件,包括logstash.yml、jvm選項配置、啓動選項配置 | /etc/logstash | path.settings |
conf | logstash數據收集配置 | /etc/logstash/conf.d/*.conf | /etc/logstash/pipelines.yml |
logs | 日誌文件 | /var/log/logstash | path.logs |
plugins | 插件目錄 | /usr/share/logstash/plugins | path.plugins |
data | 數據持久化目錄 | /var/lib/logstash | path.data |
Logstash主要有兩種配置文件,分別是:logstash.yml和pipeline.yml,logstash.yml用於配置logstash的啓動和執行相關配置,pipeline.yml用於配置流水線數據處理的配置。其中在安裝完成後,還包含如下的配置文件:
logstash.yml:定義logstash的基礎配置信息
pipeline.yml:定義數據收集規則的配置信息
jvm.options:定義JVM的總堆空間的最小值和最大值,也就是內存使用量,默認是1g
log4j2.properties:log4j2庫的相關設置
startup.options:定義logstash啓動時的相關配置
logstash.yml的詳解:
配置參數 | 解析 | 默認值 |
---|---|---|
node.name |
節點名稱定義 | 主機名 |
path.data |
持久化數據目錄定義 | LOGSTASH_HOME/data |
pipeline.id |
pipeline的id號 | main |
pipeline.java_execution |
使用java執行引擎 | false |
pipeline.workers |
定義在過濾篩選和輸出階段的進程數量 | 默認爲cpu的核心數 |
pipeline.batch.size |
定義在篩選和輸出以前單次處理數據量大小,一般和jvm的堆內存值相關,值越大,jvm內存配置也須要更大 | 125 |
pipeline.batch.delay |
批處理數據的時間延遲,在數據量不達標時的延遲時間,單位爲毫秒 | 50 |
pipeline.unsafe_shutdown |
在關機狀態強制關閉logstash在處理的數據,會致使數據丟失 | false |
path.config |
pipeline的相關配置,一般在pipeline.yml中配置好 | |
http.host |
監聽配置 | "127.0.0.1" |
http.port |
監聽端口 | 9600 |
path.logs |
日誌路徑 | LOGSTASH_HOME/logs |
log.format |
日誌格式 | 文本 |
path.plugins |
插件定義 |
Logstash配置文件構建語法:
input { ... } filter { ... } output { ... }
Logstash 使用一個名叫 FileWatch
的 Ruby Gem 庫來監聽文件變化。這個庫支持 glob 展開文件路徑,並且會記錄一個叫 .sincedb
的數據庫文件來跟蹤被監聽的日誌文件的當前讀取位置。sincedb 文件中記錄了每一個被監聽的文件的inode, major number, minor number 和 pos。
配置示例以下:
input { file { path => "/var/log/messages" type => "system" start_position => "beginning" } } output { stdout { codec => rubydebug } }
tcp模塊的使用場景以下: 有一臺服務器A只須要收集一個日誌,那麼咱們就能夠不須要在這服務器上安裝logstash,咱們經過在其餘logstash上啓用tcp模塊,監聽某個端口,而後咱們在這個服務器A把日誌經過nc發送到logstash上便可。
input { tcp { port => "5566" mode => "server" type => "tcplog" } } output { stdout { codec => rubydebug } }
syslog支持RFC3164的系統日誌格式,在logstash端進行tcp或upd的監聽,從而實現對系統日誌的收集。配置該日誌收集,本機的syslog會默認發送到logstash,同時也要在rsyslog進行配置發送的監聽地址。
# vim /etc/rsyslog.conf #修改rsyslog發送日誌的監聽端口 *.* @@192.168.56.100:44231 #配置logstash收集rsyslog發送的日誌並標準輸出 input { syslog { port => "44231" } } output { stdout { codec => rubydebug } }
具體實現中,UDP 監聽器只用了一個線程,而 TCP 監聽器會在接收每一個鏈接的時候都啓動新的線程來處理後續步驟。因此在監聽時,建議配置TCP的監聽的性能會更佳。
curl '192.168.56.100:9200/_cat/indices?v'