一、簡介
Logstash 是開源的服務器端數據處理管道,支持從不同來源采集數據,裝換數據,並將數據發送到不同的存儲庫中。
Logstash 項目誕生於 2009 年 8 月 2 日。其作者是世界著名的運維工程師喬丹西塞(JordanSissel),喬丹西塞當時是著名虛擬主機托管商 DreamHost 的員工,還發布過非常棒的軟件打包工具 fpm。
2013年,Logstash 被 Elasticsearch 公司收購。
二、安裝
Logstash 開箱即用,所以你只要下載壓縮文件,然后解壓之后就能用了。
$ wget https://artifacts.elastic.co/downloads/logstash/logstash-7.3.0.tar.gz $ tar -zxvf logstash-7.3.0.tar.gz $ cd logstash-7.3.0
三、Hello World
首先以輸出一個 “Hello World” 的形式開始 Logstash 的學習。
可以運行以下命令, stdin{}
表示從標准輸入輸入信息; -e
表示從命令行指定配置;然后 codec=>rubydebug
表示把結果輸出到控制台。
$ bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
此時在命令行輸入 Hello World
, 然后回車會看到如下結果:
{ "@version" => "1", "@timestamp" => 2019-08-09T08:52:29.790Z, "message" => "Hello World ", "host" => "chengshengzhangdeMacBook-Pro.local" }
如上顯示,Logstash 會額外增加一些信息,比如 @timestamp 時間, host 主機名等。
四、運行流程
使用過Linux的程序員都清楚,Linux 有一個管道符,類似於以下命令:
$ cat randdata | awk '{print $2}' | sort | uniq -c | tee sortdata
Logstash 就像一個管道符一樣,可以將輸入,經過過濾,然后輸出到不同的存儲庫中。Logstash 使用不同的線程來實現這些功能的,數據在線程之間以事件的形式流傳, 而且 Logstash 可以處理多行的數據。
Logstash 采用的可插拔的框架,目前已經有200多個插件。分為輸入插件(input),編碼插件(codec),過濾器插件(filter),輸出插件(output)。
Logstash 處理數據的整個流程: input | decode | filter | encode | output。
- input 插件可以對接不同數據源
- codec 插件,codec 來自 coder / decoder 兩個單詞的首字母縮寫,主要用來decode、encode事件的,codec 使 Logstash 更方便的和其他自定義的數據格式對接,將相應格式的數據轉化為Logstash事件
- filter 插件可以解析各個事件,比如把非結構化數據結構化,從IP地址解析出地理坐標等
- output 插件對接不同存儲層,比如 ElasticSearch,HDFS,Kafka等。
五、命令行參數
5.1、-e
意即執行。我們在 "Hello World" 的時候已經用過這個參數了。事實上你可以不寫任何具體配置,直接運行 bin/logstash -e ''
達到相同效果。這個參數的默認值是下面這樣:
input {
stdin { }
}
output {
stdout { }
}
5.2、--config 或 -f
意即文件。真實運行中,我們會寫很長的配置,甚至可能超過 shell 所能支持的 1024 個字符長度。所以我們必把配置固化到文件里,然后通過 bin/logstash -f agent.conf 這樣的形式運行。
此外,logstash 還提供一個方便我們規划和書寫配置的小功能。你可以直接用 bin/logstash -f /etc/logstash.d/
來運行。logstash 會自動讀取 /etc/logstash.d/
目錄下所有的文本文件,然后在自己內存里拼接成一個完整的大配置文件,再去執行。
5.3、--configtest 或 -t
意即測試。用來測試 Logstash 讀取到的配置文件語法是否能正常解析。Logstash 配置語法是用 grammar.treetop 定義的。尤其是使用了上一條提到的讀取目錄方式的讀者,尤其要提前測試。
5.4、--log 或 -l
意即日志。Logstash 默認輸出日志到標准錯誤。生產環境下你可以通過 bin/logstash -l logs/logstash.log
命令來統一存儲日志。
5.5、--filterworkers 或 -w
意即工作線程。Logstash 會運行多個線程。你可以用 bin/logstash -w 5
這樣的方式強制 Logstash 為過濾插件運行 5 個線程。
注意:Logstash目前還不支持輸入插件的多線程。而輸出插件的多線程需要在配置內部設置,這個命令行參數只是用來設置過濾插件的!
提示:Logstash 目前不支持對過濾器線程的監測管理。如果 filterworker 掛掉,Logstash 會處於一個無 filter 的僵死狀態。這種情況在使用 filter/ruby 自己寫代碼時非常需要注意,很容易碰上 NoMethodError: undefined method '*' for nil:NilClass 錯誤。需要妥善處理,提前判斷。
5.6、--pluginpath 或 -P
可以寫自己的插件,然后用 bin/logstash --pluginpath /path/to/own/plugins
加載它們。
5.7、--verbose
輸出一定的調試日志。
小貼士:如果你使用的 Logstash 版本低於 1.3.0,你只能用 bin/logstash -v
來代替。
5.8、--debug
輸出更多的調試日志。
小貼士:如果你使用的 Logstash 版本低於 1.3.0,你只能用 bin/logstash -vv
來代替。
六、參考資料