二、Logstash
2.1、安裝logstash
logstash依賴java 8或 java 11,也可以使用OpenJDK,在進行安裝時,我們需要聲明JAVA_HOME的環境變量,以保證正常地安裝。這里我們采用OpenJDK的方式,更為簡潔。
[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安裝方式:
# 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的工作原理圖:
標准的輸入輸出測試:
/usr/share/logstash/bin/logstash -e 'input {stdin {} } output { stdout {} }'
hello
2.2、Logstash的工作原理解析
Logstash進行數據采集和流水線處理主要有三個步驟:inputs --> filters --> outputs
inputs負責定義數據采集的來源,filters進行自定義的過濾日志的規則,outputs是將日志輸出到日志的存儲區域,如elasticsearch存儲。
inputs和outputs都支持對數據的格式進行編碼和解碼操作。
-
Inputs
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:將多行的文本進行合並成單行的文本格式進行輸出
2.3、Logstash的配置和運行
2.3.1、Logstash的目錄結構
在通過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 |
2.3.2、Logstash的配置文件
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 |
插件定義 |
2.4、Logstash實用舉例
Logstash配置文件構建語法:
input {
...
}
filter {
...
}
output {
...
}
2.5、Logstash常用插件
2.5.1、input插件
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的監聽的性能會更佳。
2.5.2、filter插件
- date
- grok
- dissect
- geoip
- json
- kv
- metrics
- mutate
- ruby
- split
- elapsed
curl '192.168.56.100:9200/_cat/indices?v'