天天看點

《ELK Stack權威指南(第2版)》一 1.2 Hello World

本節書摘來自華章出版社《elk stack權威指南(第2版)》一書中的第1章,第1.2節,作者 饒琛琳  更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。 

1.2 hello world

與絕大多數it技術介紹一樣,我們也以一個輸出“hello

world”的形式開始學習logstash。

1.指令行運作

在終端中,像下面這樣運作指令來啟動 logstash 程序:

# bin/logstash

-e 'input{stdin{}}output{stdout{codec=>rubydebug}}'

首先看到終端輸出一段程序啟動過程的提示輸出。提示以"successfully started logstash api endpoint

{:port=>9600}"結束。

然後你會發現終端在等待你的輸入。沒問題,敲入hello world,回車,看看會傳回什麼結果!

{

"message"

=>"hello world",

"@version"

=>"1",

"@timestamp"

=>"2014-08-07t10:30:59.937z",

"host"

=>"raochenlindemacbook-air.local",

}

沒錯!就是這麼簡單。

2.完整示例

指令行運作當然不是什麼特别友善的用法,是以絕大多數情況下,我們都是采用額外定義一個logstash.conf配置檔案的方式來啟動logstash。下面是我們的第一個完整版logstash.conf的示例:

input {

    stdin { }

output {

    stdout {

        codec => rubydebug {}

    }

    elasticsearch {

        rost=>["127.0.0.1"]

因為在5.0版本中,elasticsearch和kibana都是獨立服務。如果你按照上一節的最佳實踐配置好了yum的話,通過如下指令啟動服務即可:

# service

elasticsearch start && service kibana start

然後在終端上這樣運作:

-f logstash.conf

同樣,還是輸入一次hello world。你會看到和上一次一樣的一段ruby對象輸出。但事實上,這個完整示例可不止如此。打開另一個終端,輸入下面一行指令:

# curl

http://127.0.0.1:9200/_search?q=hello

你會看到終端上輸出下面這麼一段内容:

{"took":15,"timed_out":false,"_shards":{"total":27,"successful":27,"failed":0},"hits":{"total":1,"max_score":0.095891505,"hits":[{"_index":"logstash-2015.08.22","_type":"logs","_id":"au90s1engg_p5-w7sb32","_score":0.095891505,"_source":{"message":"hello

world","@version":"1","@timestamp":"2014-08-07t10:30:59.937z","host":"raochenlindemacbook-air.local"}}]}}

這時候你打開浏覽器,通路http://127.0.0.1:5601位址,按照提示完成index pattern配置(正常的話隻需要點選一下create按鈕),即可點選discover頁面看到如圖1-1所示的效果。你在終端上輸入的資料,可以從這個頁面上任意搜尋了。

《ELK Stack權威指南(第2版)》一 1.2 Hello World

對index pattern配置有疑惑的讀者,可以閱讀本書第三部分關于kibana的章節。

3.解釋

每位系統管理者都肯定寫過很多類似這樣的指令:cat randdata | awk '{print $2}' | sort | uniq -c | tee sortdata。這個管道符|可以算是linux世界最偉大的發明之一(另一個是“一切皆檔案”)。

logstash就像管道符一樣!

輸入(就像指令行的cat)資料,然後處理過濾(就像awk或者uniq之類)資料,最後輸出(就像tee)到其他地方。

當然實際上,logstash是用不同的線程來實作這些的。如果你運作top指令然後按下h鍵,你就可以看到下面這樣的輸出:

    pid user      pr 

ni  virt  res 

shr s %cpu %mem    time+  command

21401 root      16  

0 1249m 303m  10m s 18.6  0.2 866:25.46 |worker

21467 root      15  

0 1249m 303m  10m s  3.7 

0.2 129:25.59 >elasticsearch.

21468 root      15  

0 1249m 303m  10m s  3.7 

0.2 128:53.39 >elasticsearch.

21400 root      15  

0 1249m 303m  10m s  2.7 

0.2 108:35.80 <file

21403 root      15  

0 1249m 303m  10m s  1.3 

0.2  49:31.89 >output

21470 root      15  

0 1249m 303m  10m s  1.0 

0.2  56:24.24 >elasticsearch.

如上例所示,logstash很溫馨地給每類線程都取了名字,輸入的叫<xx,過濾的叫|xx,輸出的叫>xx。

資料線上程之間以事件的形式流傳。不要叫行,因為logstash可以處理多行事件。

logstash會給事件添加一些額外資訊。最重要的就是@timestamp,用來标記事件的發生時間。因為這個字段涉及logstash的内部流轉,是以必須是一個joda對象,如果你嘗試自己給一個字元串字段重命名為@timestamp的話,logstash會直接報錯。是以,請使用logstash-filter-date插件來管理這個特殊字段。

此外,大多數時候,還可以見到另外幾個:

host标記事件發生在哪裡。

type标記事件的唯一類型。

tags标記事件的某方面屬性。這是一個數組,一個事件可以有多個标簽。

你可以随意給事件添加字段或者從事件裡删除字段。事實上事件就是一個ruby對象,或者更簡單地了解為就是一個哈希也行。

每個logstash過濾插件,都會有四個方法叫add_tag、remove_tag、add_field和remove_field,它們在插件過濾比對成功時生效。

推薦閱讀

官網上“the life of an event”文檔:http://logstash.net/docs/1.4.2/life-of-an-event

elastic{on}上《life of a logstash event》演講:https://speakerdeck.com/elastic/life-of-a-logstash-event

繼續閱讀