- 前言
logstash是ELK日志系統中的一部分,主要承擔將收集完成日志進行過濾,並且輸出到es的職責。
logstash本身也可以作為客戶端部署到應用系統的服務器上進行日志收集,但是由於資源開銷占用過大,所以客戶端的收集工作交給了beats進行,logstash專心在獨立的服務器上完成日志解析處理的工作。
官方文檔說明:https://www.elastic.co/guide/en/logstash/
這里比較建議直接看英文的說明文檔,找到你對應的版本,別的文檔感覺都不如它靠譜(血與淚的教訓😭)。
ELK的組件版本建議保持一致,這里我采用的是5.6.10的版本,也就是beats、logstash、kibana和es都是這個版本。
- 系統結構

Logstash的事件(logstash將數據流中等每一條數據稱之為一個event)處理流水線有三個主要角色完成:inputs –> filters –> outputs:
inpust:必須,負責產生事件(Inputs generate events),常用:File、syslog、redis、beats(如:Filebeats)
filters:可選,負責數據處理與轉換(filters modify them),常用:grok、mutate、drop、clone、geoip
outpus:必須,負責數據輸出(outputs ship them elsewhere),常用:elasticsearch、file、graphite、statsd
其中inputs和outputs支持codecs(coder&decoder)在1.3.0 版之前,logstash 只支持純文本形式輸入,然后以過濾器處理它。但現在,我們可以在輸入 期處理不同類型的數據,所以完整的數據流程應該是:input | decode | filter | encode | output;codec 的引入,使得 logstash 可以更好更方便的與其他有自定義數據格式的運維產品共存,比如:graphite、fluent、netflow、collectd,以及使用 msgpack、json、edn 等通用數據格式的其他產品等。
- 下載安裝
這邊介紹下我的安裝方式,我是在linux centos6.5的操作系統上進行安裝的。
第一步,安裝JDK1.8,這里不做過多介紹了。
第二步,去官網下載logstash安裝包,地址:https://www.elastic.co/cn/downloads/past-releases/logstash-5-6-10,替換后面的版本號找到對應的版本就行。
我下載的tar壓縮包logstash-5.6.10.tar.gz,解壓完后進入目錄。
tar -zxvf logstash-5.6.10.tar.gz -C /usr/
cd /usr/logstash-5.6.10
#在目錄下隨便建個文件夾用存放conf文件
[root@localhost logstash-5.6.10]# mkdir logstash.conf
第三步,編寫一個簡單的conf文件測試功能。
[root@localhost logstash-5.6.10]# vi logstash.conf/stdin.conf
#下面是conf文件示例,只構造了標准輸入和輸出
input {
stdin {
add_field => {"key" => "value"}
codec => "plain"
tags => ["add"]
type => "std"
}
}
output {
# 標准輸出
stdout { codec => rubydebug }
}
構建完成后保存,啟動命令
[root@localhost logstash-5.6.10]# bin/logstash -f logstash.conf/stdin.conf
輸入"hello"

至此logstash的安裝已經完成,還算簡單吧。
- 安裝filebeat
一開始介紹的時候說了,logstash一般扮演日志過濾的角色,日志收集交給beats來完成,filebeat是beats的一個組件,並且高版本的logstash很多插件如input-log4j2-plugin無法使用,相信很多小伙伴用logstash來處理log4j的日志的,官方建議采用beats插件來完成input的功能。
由於beats包括filebeats在后面介紹beats的時候會詳細講解,這邊就先簡單介紹下安裝過程。
官方下載地址:https://www.elastic.co/cn/downloads/past-releases/filebeat-5-6-10,同樣的下載tar包后解壓就能食用。
tar -zxvf filebeat-5.6.10.tar.gz -C /usr/
cd /usr/filebeat-5.6.10
#修改配置文件filebeat.yml
[root@localhost filebeat-5.6.10]# vi filebeat.yml
filebeat.prospectors:
- input_type: log
path:
#這是filebeat輸入的log存放路徑,改成你應用的日志存放路徑
- /home/filebeat_log/*.log
#沒有安裝es集群的先注釋掉es的配置,否則運行中日志會warn,打開輸出配置,端口號為5044,待會在logstash中需要這個端口號


下面給一個啟動filebeat的啟動腳本,也可以直接命令行啟動:service filebeat start
#!/bin/bash
#注意修改你的home路徑 FILEBEAT_HOME="/usr/filebeat-5.6.10" agent="$FILEBEAT_HOME/filebeat" args="-c $FILEBEAT_HOME/filebeat.yml -path.home $FILEBEAT_HOME -path.config $FILEBEAT_HOME -path.data $FILEBEAT_HOME/data -path.logs $FILEBEAT_HOME/logs" test_args="-e -configtest" test() { echo "test config" $agent $args $test_args } start() { pid=`ps -ef |grep $FILEBEAT_HOME/data |grep -v grep |awk '{print $2}'` if [ ! "$pid" ];then echo "Starting filebeat: " test if [ $? -ne 0 ]; then echo exit 1 fi $agent $args & if [ $? == '0' ];then echo "start filebeat ok" else echo "start filebeat failed" fi else echo "filebeat is still running!" exit fi } stop() { echo -n $"Stopping filebeat: " pid=`ps -ef |grep $FILEBEAT_HOME/data |grep -v grep |awk '{print $2}'` if [ ! "$pid" ];then echo "filebeat is not running" else kill $pid echo "stop filebeat ok" fi } restart() { stop start } status(){ pid=`ps -ef |grep $FILEBEAT_HOME/data |grep -v grep |awk '{print $2}'` if [ ! "$pid" ];then echo "filebeat is not running" else echo "filebeat is running" fi } case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) status ;; test) test ;; *) echo $"Usage: $0 {start|stop|restart|status}" exit 1 esac
保存成filebeat.sh后啟動。
sh filebeat.sh start
- logstash集成filebeat
回到logstash的安裝目錄,新建conf配置文件log4j2.conf
input {
beats {
port => 5044
}
}
output {
# 標准輸出
stdout { codec => rubydebug }
}
對只需要在input里加入beats插件,端口號是你剛剛在filebeat.yml中的端口號,啟動logstash
[root@localhost logstash-5.6.10]# logstash -f logstash.conf/log4j2.conf
當你在/home/filebeat_log/*.log中產生日志文件時,logstash就會進行解析。
