天天看點

《ELK Stack權威指南(第2版)》一1.3 配置文法

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

1.3 配置文法

logstash社群通常習慣用shipper、broker和indexer來描述資料流中不同程序各自的角色,如圖1-2所示。

《ELK Stack權威指南(第2版)》一1.3 配置文法

不過我見過很多運用場景裡都沒有用logstash作為shipper,或者說沒有用elasticsearch作為資料存儲,也就是說也沒有indexer。是以,我們其實不需要這些概念。隻需要學好怎麼使用和配置logstash程序,然後把它運用到你的日志管理架構中最合适它的位置就夠了。

1.3.1 文法

logstash設計了自己的dsl,有點像puppet的dsl,或許因為都是用ruby語言寫的吧,區域、注釋、資料類型(布爾值、字元串數值、數組、哈希)都類似,條件判斷、字段引用等也一樣。

1.區段(section)

logstash用{}來定義區域。區域内可以包括插件區域定義,你可以在一個區域内定義多個插件。插件區域内則可以定義鍵值對設定。示例如下:

input {

    stdin {}

    syslog {}

}

2.資料類型

logstash支援少量的資料值類型:

希爾值(bool)

debug => true

字元串(string)

host

=>"hostname"

數值(number)

port => 514

數組(array)

match =>

["datetime", "unix", "iso8601"]

哈希(hash)

options => {

    key1 =>"value1",

    key2 =>"value2"

如果你用的版本低于1.2.0,哈希的文法跟數組是一樣的,像下面這樣寫:

match => [

"field1", "pattern1", "field2",

"pattern2" ]

3.字段引用(field reference)

字段是 logstash::event對象的屬性。我們之前提過事件就像一個哈希一樣,是以你可以想象字段就像一個鍵值對。

如果你想在logstash配置中使用字段的值,隻需把字段的名字寫在中括号[ ]裡就行了,這就叫“字段引用”。

對于“嵌套字段”(也就是多元哈希表,或者叫哈希的哈希),每層的字段名都寫在[ ]裡就可以了。比如,你可以從geoip裡這樣擷取longitude值(是的,這是個笨辦法,實際上有單獨的字段專門存這個資料的):

[geoip][location][0]

logstash的數組也支援倒序下标,即[geoip][location][-1]可以擷取數組最後一個元素的值。

logstash還支援變量内插,在字元串裡使用字段引用的方法是這樣:

"the

longitude is %{[geoip][location][0]}"

4.條件判斷(condition)

logstash從1.3.0版開始支援條件判斷和表達式。

表達式支援下面這些操作符:

 "equality, etc: ==, !=, <, >,

<=, >=

 "regexp: =~, !~

 "inclusion: in, not in

 "boolean: and, or, nand, xor

 "unary: !()

通常來說,你都會在表達式裡用到字段引用。比如:

if "_grokparsefailure"

not in [tags] {

} else if

[status] !~ /^2\d\d/ and [url] == "/noc.gif" {

} else {

1.3.2 指令行參數

logstash提供了一個shell腳本叫logstash友善快速運作,下面介紹它支援的參數:

1. -e

意即“執行”。我們在“hello world”的時候已經用過這個參數了。事實上你可以不寫任何具體配置,直接運作bin/logstash -e ''可達到相同效果。這個參數的預設值是下面這樣:

    stdin { }

output {

    stdout { }

2. --config或-f

意即“檔案”。真實運用中,我們會寫很長的配置,甚至可能超過shell所能支援的1024個字元長度。是以我們必把配置固化到檔案裡,然後通過bin/logstash -f

agent.conf這樣的形式來運作。

此外,logstash還提供一個友善我們規劃和書寫配置的小功能。你可以直接用bin/logstash -f /etc/logstash.d/來運作。logstash會自動讀取/etc/logstash.d/目錄下所有的文本檔案,然後在自己記憶體裡拼接成一個完整的大配置檔案,再去執行。

logstash列出目錄下所有檔案時是字母排序的。而logstash配置段的filter和 output都是順序執行的,是以順序非常重要。采用多檔案管理的使用者,推薦采用數字編号方式命名配置檔案,同時在配置中嚴謹采用if判斷限定不同日志的動作。

3. --configtest或-t

意即“測試”。用來測試logstash讀取到的配置檔案文法是否能正常解析。logstash配置文法是用grammar.treetop定義的。尤其是使用了上一條提到的讀取目錄方式的讀者,尤其要提前測試。

4. --log或-l

意即“日志”。logstash預設輸出日志到标準錯誤。生産環境下你可以通過bin/logstash -l logs/logstash.log指令來統一存儲日志。

5.

--pipeline-workers 或 -w

運作filter和output的pipeline線程數量,預設是cpu核數。

6.

--pipeline-batch-size 或 -b

每個logstash pipeline線程,在執行具體的filter和output函數之前,最多能累積的日志條數,預設是125條。越大性能越好,同樣也會消耗越多的jvm記憶體。

7.

--pipeline-batch-delay 或 -u

每個logstash pipeline線程,在打包批量日志的時候,最多等待幾毫秒,預設是5 ms。

8. --pluginpath或-p

可以寫自己的插件,然後用bin/logstash --pluginpath /path/to/own/plugins加載它們。

如果你使用的logstash版本在1.5.0-rc3到1.5.3之間,該參數一度被取消,請改用本地gem插件安裝形式。

9. --verbose

輸出一定的調試日志。如果你使用的logstash版本低于1.3.0,則用bin/logstash -v來代替。

10. --debug

輸出更多的調試日志。如果你使用的logstash版本低于1.3.0,則用bin/logstash

-vv來代替。

1.3.3 設定檔案示例

從logstash 5.0開始,新增了$ls_home/config/logstash.yml檔案,可以将所有的指令行參數都通過yaml檔案方式設定。同時為了反映指令行配置參數的層級關系,參數也都改成用.而不用-了。

上小節的pipeline相關指令行參數,改用 yaml 檔案的寫法如下:

pipeline:

    workers: 24

    batch:

        size: 125

        delay: 5

繼續閱讀