在前面我們講解了Elasticsearch的Kibana插件,對於我們實際使用來說可能Kibana並不會使用到,但是Logstash插件大部分的情況下都會使用,那Logstash到底是啥?今天我們就來介紹一下。
一、Logstash
1、Logstash是什麼?
官方介紹說Logstash是開源的服務器端數據處理管道,能夠同時從多個來源採集數據,轉換數據,然後將數據發送到您最喜歡的 “存儲庫” 中。(我們的存儲庫當然是 Elasticsearch。)
通過200多個插件,Logstash可以接受幾乎各種各樣的數據。包括日誌、網絡請求、關係型數據庫、傳感器或物聯網等等。
簡單點來說就是Logstash是採集數據的工具,它可以從數據庫、文件、MQ等中獲取數據,然後放入到我們的搜索引擎(Elasticsearch)當中,供我們快速查詢到需要的數據。
2、安裝Logstash
注意:Logstash安裝需要Java8或Java11版本。
Logstash的安裝也支持多種方式:
二進制安裝
下載二進制文件安裝,這裏是最新版本下載,如果要選擇過去的版本,歷史版本。
直接下載二進制文件,解壓後進入bin目錄運行即可。
在Linux環境中,我們可以通過包管理進行安裝,例如Unbuntu中的apt、以及CentOS中的yum。
APT安裝
安裝公共簽名key
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
添加依賴
echo "deb https://artifacts.elastic.co/packages/7.0/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.0.list
安裝Logstash
sudo apt-get update && sudo apt-get install logstash
YUM安裝
安裝公共簽名key
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
在/etc/yum.repos.d/目錄下,新建文件logstash.repo,內容如下:
[logstash-7.0]
name=Elastic repository for 7.0 packages
baseurl=https://artifacts.elastic.co/packages/7.0/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
安裝Logstash
sudo yum install logstash
注意:Logstash最好也是不用root用戶安裝、啓用。
3、測試Logstash
我們知道Logstash是基於管道流的,所有它需要兩個必須元素input和output,還有一個可選的filter。輸入input插件可以自定義獲取數據源,過濾filter插件可以自定義修改數據,輸出output插件可以讓自定義寫入數據到目的地。
進入Logstash目錄,執行測試命令,如下:
bin/logstash -e 'input { stdin { } } output { stdout {} }'
這裏我們通過設置-e參數來運行Logstash,-e參數表示允許Logstash直接通過命令行接受配置。能夠讓我們快速測試看是否有錯誤。
當出現“Pipeline main started”字樣後,我們輸入hello world,可以看到如下的輸出信息。
按住CTRL-D可以結束Logstash進程。
二、Logstash的簡單使用
1、Logstash如何工作?
在前面我們大致熟悉了一下Logstash的基本流程,那麼Logstash到底是如果工作的呢?我們來分析一下。
Logstash事件處理管道有三個階段:輸入→過濾器→輸出。輸入生成事件,過濾器修改它們,輸出將它們發送到其他地方。輸入和輸出支持編解碼器,能夠在數據進入或退出管道時對數據進行編碼或解碼,而無需使用單獨的過濾器。
輸入(Inputs):
使用輸入將數據導入到Logstsh。常用的包括:
- file:從文件系統上的文件讀取,與UNIX命令非常相似 tail -0F
- syslog:在已知端口514上偵聽syslog消息並根據RFC3164格式進行解析
- redis:使用redis通道和redis列表從redis服務器讀取。
- beats:處理 Beats發送的事件。
還可以從其他系統獲取數據,更多支持可以查看輸入插件列表。
過濾器(Filters):
過濾器是Logstash管道中的中間處理設備。可以將過濾器與條件組合,以便在事件滿足特定條件時對其執行操作。一些有用的過濾包括:
- grok:解析並構造任意文本。Grok是目前Logstash中將非結構化日誌數據解析爲結構化和可查詢內容的最佳方式。有了內置於Logstash的120種模式,您很可能會找到滿足您需求的模式!
- mutate:對事件字段執行常規轉換。您可以重命名,刪除,替換和修改事件中的字段。
- drop:完全刪除事件,例如調試事件。
- clone:製作事件的副本,可能添加或刪除字段。
- geoip:添加有關IP地址的地理位置的信息(也在Kibana中顯示驚人的圖表!)
更多支持,查看過濾插件列表。
輸出(Outputs):
輸出是Logstash管道的最後階段。事件可以通過多個輸出,但是一旦所有輸出處理完成,事件就完成了它的執行。一些常用的輸出包括:
- elasticsearch:將事件數據發送到Elasticsearch。Elasticsearch方便且易於查詢的格式保存數據,是我們不二選擇。
- file:將事件數據寫入磁盤上的文件。
- graphite:將事件數據發送到graphite,這是一種用於存儲和繪製指標的流行開源工具。http://graphite.readthedocs.io/en/latest/
- statsd:將事件數據發送到statsd,這是一種“偵聽統計信息,如計數器和定時器,通過UDP發送並將聚合發送到一個或多個可插入後端服務”的服務。如果您已經在使用statsd,這可能對您有用!
更多支持,查看輸出插件列表。
編解碼器(Codecs):
編解碼器基本上是流過濾器,可以作爲輸入或輸出的一部分。使用編解碼器可以輕鬆地將消息傳輸與序列化過程分開。流行的編解碼器包括json,msgpack和plain (文本)。
- json:以JSON格式編碼或解碼數據。
- multiline:將多行文本事件(如java異常和堆棧跟蹤消息)合併到一個事件中。
更多支持,查看編解碼插件列表。
2、Logstash實例
我們創建一個logstash-simple.conf文件,內容如下:
input { stdin { } }
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
這裏的意思是,我們將輸入的信息輸出到elasticsearch中顯示,同時也輸出到控制檯中顯示。即這裏我們使用了多重輸出。
接着我們輸入命令:
bin/logstash -f logstash-simple.conf
-f爲指定配置文件,logstash-simple.conf爲配置文件加上具體路徑即可。
運行完畢後,我們在命令端輸出hello anumbrella
內容,可以查看到終端內容顯示出來了。
同時elasticsearch-head中我們可以查看到先前輸入的數據。
這裏便完成了Logstash獲取數據,然後存儲到Elasticsearch中的基本操作。
接着我們再新建一個logstash-filter.conf文件,如下:
input { stdin { } }
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
這裏我們添加了filter進行過濾匹配。
同理運行Logstash:
bin/logstash -f logstash-filter.conf
待啓動完畢後,我們在終端輸入下面的信息:
127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] "GET /xampp/status.php HTTP/1.1" 200 3891 "http://cadenza/xampp/navi.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0"
結果如下:
在這裏Logstash(使用了grok過濾器)能夠將一行的日誌數據(Apache的"combined log"格式)分割設置爲不同的數據字段。這一點對於日後解析和查詢我們自己的日誌數據非常有用。更多詳細配置可以查看Logstash grok patterns。
前面的實例我們都是從命令端輸入然後輸出數據,這裏我們再新建一個logstash-apache.conf內容如下,主要是配置了從文件中讀取日誌信息。
input {
file {
path => "/tmp/access_log"
start_position => "beginning"
}
}
filter {
if [path] =~ "access" {
mutate { replace => { "type" => "apache_access" } }
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
}
stdout { codec => rubydebug }
}
接着我們在/tmp目錄下新建access_log文件,添加內容如下:
71.141.244.242 - kurt [18/May/2011:01:48:10 -0700] "GET /admin HTTP/1.1" 301 566 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3"
134.39.72.245 - - [18/May/2011:12:40:18 -0700] "GET /favicon.ico HTTP/1.1" 200 1189 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2; .NET4.0C; .NET4.0E)"
98.83.179.51 - - [18/May/2011:19:35:08 -0700] "GET /css/main.css HTTP/1.1" 200 1837 "http://www.safesand.com/information.htm" "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
再次運行啓動Logstash,
bin/logstash -f logstash-apache.conf
我們可以查看到apache的日誌數據已經導入到ES中了,在終端也輸出了相應內容。這裏Logstash會按照你的配置讀取,處理指定的文件,任何後添加到文件的內容也會被捕獲處理最後保存到ES中。此外,數據中type的字段值會被替換成"apache_access"(這個功能在配置中已經指定)。
查看elasticsearch中保存的數據,如下:
除此之外,我們還可以配置正則匹配所有文件,比如:
input {
file {
path => "/tmp/*_log"
...
這裏我們可以監控error日誌和access日誌等不同類型的日誌信息。
我們可以在過濾器裏面通過條件判斷來處理不同的輸出文件,比如我們更改上面logstash-apache.conf文件如下:
input {
file {
path => "/tmp/*_log"
}
}
filter {
if [path] =~ "access" {
mutate { replace => { type => "apache_access" } }
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
} else if [path] =~ "error" {
mutate { replace => { type => "apache_error" } }
} else {
mutate { replace => { type => "random_logs" } }
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
該type字段標記所有事件,但實際上並不解析error或random文件。有很多類型的錯誤日誌,應該如何標記,這個實際上取決於我們正在使用的日誌。
我們還可以監控端口,比如Syslog日誌。
Syslog是Logstash最常見的用例之一,它處理得非常好(只要日誌行大致符合RFC3164)。Syslog是事實上的UNIX聯網日誌記錄標準,它將消息從客戶端計算機發送到本地文件,或通過rsyslog發送到集中式日誌服務器。
還是一樣的,這裏我們新建logstash-syslog.conf文件,內容如下:
input {
tcp {
port => 5000
type => syslog
}
udp {
port => 5000
type => syslog
}
}
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
這裏我們監控了TCP 和UDP協議上端口5000的系統日誌信息作爲Logstash的輸入來源。
執行logstash:
bin/logstash -f logstash-syslog.conf
通常,客戶端計算機將連接到端口5000上的Logstash實例併發送其消息。對於這個例子,我們只是telnet到Logstash並輸入一個日誌行(類似於我們之前在STDIN中輸入日誌行的方式)。打開另一個命令窗口以與Logstash syslog輸入交互並輸入以下命令:
telnet localhost 5000
接着在命令窗口輸入下面日誌信息,模擬交互過程。
Dec 23 12:11:43 louis postfix/smtpd[31499]: connect from unknown[95.75.93.154]
Dec 23 14:42:56 louis named[16000]: client 199.48.164.7#64817: query (cache) 'amsterdamboothuren.com/MX/IN' denied
Dec 23 14:30:01 louis CRON[619]: (www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null 2>/var/log/cacti/poller-error.log)
Dec 22 18:28:06 louis rsyslogd: [origin software="rsyslogd" swVersion="4.2.0" x-pid="2253" x-info="http://www.rsyslog.com"] rsyslogd was HUPed, type 'lightweight'.
我們在終端可以查看到相關信息輸出:
到此Logstash的基本使用到此結束,當然還有更多用法,會在後面的文章再進行介紹。