1. 程式人生 > >Logstash6.x 入門

Logstash6.x 入門

簡介

        Logstash是一個開源的伺服器端資料處理管道,可以同時從多個源獲取資料。面對海量的日誌量,rsyslog和sed,awk等日誌收集,處理工具已經顯的力不從心。logstash是一個整合型的框架,可以用以日誌的收集,儲存,索引構建(一般這個功能被ES取代)。

工作機制



   logstash 的伺服器端從redis/kafka/rabbitmq等(broker)訊息佇列獲取資料。一條資料一條資料的清洗。清洗完成後傳送給elasticsearch叢集。再在kibana上顯示。
  對於logstash而言,他的所有功能都是基於外掛來完成的。input,filter,output等等都是這樣。

輸入外掛:     提取所有的資料。 資料通常以多種格式散佈或分佈在各個系統上。logstash支援各種輸入。可以從常見的各類源中獲取事件。輕鬆從日誌,指標,web應用程式和各種AWS服務中進行採集,所有的這些都是以連續流的方式進行。         

過濾器:     隨著資料傳輸而來。logstash過濾器解析每一個事件,識別命名欄位以構建結構。將它們轉換為通用格式,從而更輕鬆,更快捷的分析。常用的過濾資料手段。(1)、用grok從非結構化資料匯出結構。(2)、從IP地址解讀地理座標。(3)、匿名PII資料,完全排除敏感欄位。 (4)、簡化資料來源,格式或模式。             

  產出:   當然,elasticsearch是首選的輸出物件,但是還有很多的選項。可根據需要路由。           

安裝

       由於Logstash使用Jruby研發,所以需要JVM。也就是需要安裝java環境。其工作與agent/server模型下。
      這裡也簡單的演示一下JAVA的環境配置。首先準備好jdk的tar包。
# mkdir /usr/java  
# tar xf jdk-8u151-linux-i586.tar.gz -C /usr/java  
# vim /etc/profile  
JAVA_HOME=/usr/java/jdk1.8.0_151  
export JRE_HOME=/usr/java/jdk1.8.0_151/jre  
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH  
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH  
# update-alternatives --install /usr/bin/java java /usr/java/jdk1.8.0_151/bin/java 300  
# update-alternatives --install /usr/bin/javac javac /usr/java/jdk1.8.0_151/bin/javac 300  
# update-alternatives --config java  
  
共有 3 個程式提供“java”。  
  
  選擇    命令  
-----------------------------------------------  
*+ 1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java  
   2           /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java  
   3           /usr/java/jdk1.8.0_151/bin/java  
  
按 Enter 來儲存當前選擇[+],或鍵入選擇號碼:3  
       若出現 -bash: /usr/java/jdk1.8.0_151/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: 沒有那個檔案或目錄  這個錯誤, 則執行 yum install glibc.i686  即可。

安裝logstash。在logstash官網上去下載rpm包。
# yum -y install logstash-6.1.2.rpm
這就安裝完成了,但是 logstash的命令由於是rpm包安裝。預設安裝到了/usr/share/logstash下。所以可以把這個路徑引入一下。

外掛介紹

      常見的外掛。在諸多的input外掛當中有file,udp,http,kafka,rabbitmq,beats等等

   file:     檔案流事件。類似與 tail -n 1 -f 開始閱讀。當然也可以從頭開始閱讀。利用了sincedb記錄檔案的狀態,包括檔案的inode號,主裝置號,從裝置號,檔案內位元組偏移量。所以檔案不能改名字。一改名字就會使用新的sincedb。
input {
        file {
                path => ["/var/log/messages"]
                type => "system"
                start_position => "beginning"
             }
}
  udp:     通過udp將訊息作為事件通過網路讀取。唯一需要的配置項是port,它指定udp埠logstash將監聽事件流。
演示一下。
    先安裝 collectd(epel源中)    yum -y install collectd      collectd是一個性能監控程式。 編輯配置檔案 /etc/collectd.conf 將想要監控的內容取消註釋。 (一定要取消 network)
Hostname    "node-1"
LoadPlugin syslog
LoadPlugin battery
LoadPlugin cpu
LoadPlugin df
LoadPlugin disk
LoadPlugin interface
LoadPlugin load
LoadPlugin memory
LoadPlugin network
<Plugin network>
	<Server "192.168.40.133" "25826"> #192.168.40.133 是logstash監聽的地址,25826 是logstash監聽埠
 	</Server>
</Plugin>
Include "/etc/collectd.d"

啟動即可。 systemctl  start   collectd 接下來寫一個udp.conf 
input {
        udp {
                port => 25826
                codec => collectd {}
                type  => "collectd"
        }
}

output {
        stdout {
                codec   => rubydebug
        }
}
執行命令。開始收集。
# logstash -f udp.conf 開始收集,內容如下

Filter外掛:

    用於在將event發往output之前,對其實現一定的處理功能。
grok:     用於分析並結構化文字資料。目前是logstash中非結構化資料轉化為結構化資料的不二之選。可處理 syslog,Apache,nginx格式的日誌。

80.91.33.133 - - [17/May/2015:08:05:41 +0000] "GET /downloads/product_1 HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.16)"

上面是一段nginx的訪問日誌。 %remote_ip  自動替換  80.91.33.133  以此類推。
%{IPORHOST:remote_ip} - %{DATA:user_name} \[%{HTTPDATE:time}\] "%{WORD:request_action} %{DATA:request} HTTP/%{NUMBER:http_version}" %{NUMBER:response} %{NUMBER:bytes} "%{DATA:referrer}" "%{DATA:agent}"

相關的預定義 語法的查閱檔案,在rpm包有安裝

# vim /usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns/grok-patterns
USERNAME [a-zA-Z0-9._-]+
USER %{USERNAME}
EMAILLOCALPART [a-zA-Z][a-zA-Z0-9_.+-=:]+
EMAILADDRESS %{EMAILLOCALPART}@%{HOSTNAME}
INT (?:[+-]?(?:[0-9]+))
BASE10NUM (?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))
NUMBER (?:%{BASE10NUM})
BASE16NUM (?<![0-9A-Fa-f])(?:[+-]?(?:0x)?(?:[0-9A-Fa-f]+))
BASE16FLOAT \b(?<![0-9A-Fa-f.])(?:[+-]?(?:0x)?(?:(?:[0-9A-Fa-f]+(?:\.[0-9A-Fa-f]*)?)|(?:\.[0-9A-Fa-f]+)))\b
...
 語法格式 %{SYNTAX:SEMANTIC}    SYNTAX : 預定義模式名稱(在grok-patterns檔案中定義的)   SEMANTIC:匹配到的文字的自定義標示符(匹配到後,賦值給該變數)

beats家族是很常見的。



  Filebeat:      Filebeat是ELK的一部分。可以使Logstash,Elasticsearch和Kibana無縫協作。filebeat的功能是轉發和彙總日誌與檔案。  filebeat可以讀取並轉發日誌行,如果出現中斷,還會在一切恢復正常後,從中斷的位置繼續開始。      beat外掛(這是一個input外掛)
input {
  beats {
    port => 5044
  }
}

output {
  elasticsearch {
    hosts => "localhost:9200"
    manage_template => false
    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
    document_type => "%{[@metadata][type]}"
  }
}
output外掛:      這一般是把資料儲存下來的,有email,csv。當然還有大名鼎鼎的 Elasticsearch。這就不詳細介紹了。官網上有很多的例子。 logstash指導教程