logstash 組態檔語法介紹

2023-11-27 18:00:49

大家好,我是藍胖子,之前在構建服務監控實踐那個系列裡,有提到用logstash來做紀錄檔的收集,但是對於logstash的組態檔語法沒有做很詳細的介紹,今天就來詳細聊聊logstash組態檔的語法。

很多時候一門新框架的設定都會有自己獨有的組態檔格式,是先簡單瞭解組態檔語法結構,能夠讓自己更加系統的掌控新框架的各項設定。

檔案結構

先來看看logstash的組態檔結構,組態檔分為3部分,input輸入,filter過濾,output輸出。組態檔是以{} 來定義區段的。如下,

input { }
filter { }
output { }

顧名思義,它們分別表示logstash的輸入來源,輸入來源可以是檔案,filebeat等等。filter則是定義對輸入源內容進行二次處理,過濾提取等等。outpout則是將處理後的內容重新輸出到其他元件,比如elasticsearch或者通過http介面輸出到自定義服務中。

外掛

在每一個區段內,可以引入logstash的外掛,外掛的設定同樣也是用{}包裹起來的。如下,我在input區域內部定義了stdin和syslog外掛。

input { stdin {} syslog {} }

不過通常在filebeat和logstash搭配使用時,通常是將logstash的輸入來源定義為filebeat的外掛,如下

input {
  beats {
    port => 5044
  }
}

而filebeat的組態檔中,則是將輸出源設定為logstash,如下是filebeat的部分組態檔範例,

output.logstash:  
  hosts:  192.168.0.2:5054

不同的外掛具體有哪些設定,有哪些外掛可以使用,參考官方檔案 https://www.elastic.co/guide/en/logstash/current/plugins-inputs-beats.html

語法規則

介紹了組態檔的結構後,我們來看看組態檔的語法規則。

宣告賦值變數

在組態檔中,賦值一個變數使用的是=>符號,像前面提到把輸入源定義為filebeat時,就將port變數賦值為5044了。

    port => 5044

除了數值型別,logstash還會有字串,布林,陣列,hash型別,它們寫法如下,

字串型別

host =>"hostname"

布林型別

debug => true

陣列型別

match => ["datetime", "UNIX", "ISO8601"]

hash型別

options => { key1 =>"value1", key2 =>"value2" }

參照變數

宣告賦值完變數後,如何參照呢,在logstash中是通過[]對變數進行參照,如下,我宣告了一個變數debug, 然後參照它。

filter {
	debug => true
}
output {
	if [debug]==true {
		...
	}
}

如果是那種結構體型別,比如json,或者hash結構,那麼可以使用多重[]得到其值,如下,

output {
	options => { key1 =>"value1", key2 =>"value2" }
	if [options][key1]=="2" {
		...
	}
}

內插變數

logstash還支援內插變數,如下,我在使用elasticsearch外掛時,需要定義輸出的索引名稱,這個名稱是根據紀錄檔來源中不同的內容建立不同的索引名稱。[fields][log_type]參照的則是出入來源中的變數名。

output {
   elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "easymonitor-%{[fields][log_type]}-%{+yyyy.MM.dd}"
  }
}

條件判斷

其實在介紹變數參照的時候,你應該已經看到if語句,除此以外if else語句也是支援的。如下所示,

if "_grokparsefailure" not in [tags] {
	...
} else if [status] !~ /^2\d\d/ and [url] == "/noc.gif" {
	...
} else { 
	...
}

logstash支援的判斷表示式包括

比較大小: ==, !=, <, >, <=, >= ·
正則: =~, !~ 
包含關係: in, not in 
布林表示式: and, or, nand, xor 
對錶示式取反操作: !(表示式)

注意logstash是不支援&& 和 || 表示並且和或關係的,應該用and 和or代替。

條件表示式定義多個輸出源

使用條件表示式,在條件表示式中定義不同的輸出外掛,達到根據不同內容輸出到不同元件的目的,以下是設定案例,通過判斷紀錄檔的等級,等級為error或者紀錄檔型別是es的紀錄檔時,則輸出到報警服務中。

output {
   elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "easymonitor-%{[fields][log_type]}-%{+yyyy.MM.dd}"
  }

  if [loglevel] == "Error" or  [fields][log_sub_type]=="es"  {

    http {
           http_method => "post"
           url => "http://192.168.0.2:36060/alert_log"
        }
  }
}

總結

logstash的組態檔語法還算是很簡單的,靈活的使用條件表示式可以定義多個輸出源,想要掌握logstash更多的設定還是要去官網掌握一些外掛的用法,不過在看懂語法的基礎上,學習外掛的用法就是水到渠成的事情了。