Elasticsearch學習(四)——Logstash安裝與使用

在前面我們講解了Elasticsearch的Kibana插件,對於我們實際使用來說可能Kibana並不會使用到,但是Logstash插件大部分的情況下都會使用,那Logstash到底是啥?今天我們就來介紹一下。

一、Logstash

1、Logstash是什麼?

官方介紹說Logstash是開源的服務器端數據處理管道,能夠同時從多個來源採集數據,轉換數據,然後將數據發送到您最喜歡的 “存儲庫” 中。(我們的存儲庫當然是 Elasticsearch。)

logstash

通過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,可以看到如下的輸出信息。
test

按住CTRL-D可以結束Logstash進程。

二、Logstash的簡單使用

1、Logstash如何工作?

在前面我們大致熟悉了一下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內容,可以查看到終端內容顯示出來了。

example

同時elasticsearch-head中我們可以查看到先前輸入的數據。

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"

結果如下:
logstash2
在這裏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"(這個功能在配置中已經指定)。

example2
查看elasticsearch中保存的數據,如下:
example2

除此之外,我們還可以配置正則匹配所有文件,比如:

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'.

我們在終端可以查看到相關信息輸出:

example3

到此Logstash的基本使用到此結束,當然還有更多用法,會在後面的文章再進行介紹。

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章