Logstash最強大的功能在於豐富的過濾器插件。此過濾器提供的並不僅僅是過濾的功能,還能夠對進入過濾器的原始數據進行復雜的邏輯處理。甚至添加獨特的事件到後續流程中。數據庫
一、logstash基本語法組成json
logstash主要由三部分組成:input、filter、output。而filter就是過濾器插件,這個組件能夠不要,可是這樣子就不能體現出logtash的強大過濾功能了。ruby
input{
輸入插件
}
filter{
過濾器插件
}
outer{
輸出插件
}
下面咱們依次對各個插件進行介紹網絡
1.一、logstash輸入插件(input)app
Logstash的輸入插件主要用來接收數據,Logstash支持多種數據源,常見的有讀取文件、標準輸入、讀取syslog日誌、讀取網絡數據等,這裏分別介紹下每種接收數據源的配置方法編碼
咱們先來看個例子:spa
input{
file{
path => ["/var/log/messages"]
type => "system"
start_position => "timestamp"
}
}
output{
stdout{
codec => rubydebug
}
}
這時咱們有幾個小疑問:插件
一、logstash的input是怎麼樣接收日誌的呢?debug
logstash使用一個名爲filewatch的ruby gem庫來監聽文件變化,並經過一個叫.sincedb的數據庫文件來記錄被監聽的日誌文件的讀取進度(時間戳)。這個sincedb數據文件的默認路徑在 <path.data>/plugins/inputs/file下面,文件名相似於.sincedb_452905a167cf4509fd08acb964fdb20c。而<path.data>表示logstash插件存儲目錄,默認是LOGSTASH_HOME/data。(rpm包安裝則是在/usr/share/logstash目錄下)。日誌
二、logstash的input技術跟Linux的那個比較像呢?
input就跟Linux的管道右側內容同樣,在Linux管道中,左側的輸出傳給管道的右側接收機制。而input就是如此,當他監聽一個文件時,會以tail -f命令的形式逐行獲取數據。不過input能夠指定從哪一個地方(某一時間戳)開始讀取,而start_position就是指定時間戳。若是不指定則從頭開始讀取。type則是用來標記時間類型。
下面舉個例子來看:
1.二、標準輸入
stdin是從標準輸入獲取信息的。這裏咱們看一個稍微複雜一點的例子:
input { stdin { add_field => {"key"=>"apple"} tags => ["add1"] type => "test1" } } output { stdout { codec => rubydebug } }
而後咱們啓動一下終端,你們要注意,我這裏沒有指定輸入文件,而指定的是stdin,表示標準輸入,意思就是交互式輸入數據。
[root@::172.31.22.29 /etc/logstash/conf.d]#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/l1.conf Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties hello word #手動輸入此信息 { "type" => "test1", "@version" => "1", "message" => "hello word", "@timestamp" => 2019-01-22T05:42:08.340Z, "tags" => [ [0] "add1" ], "host" => "ip-172-31-22-29.ec2.internal", "key" => "apple" }
type和tags是logstash的兩個特殊字段, type通常會放在input中標記事件類型, tags主要用於在事件中增長標籤,以便在後續的處理流程中使用,主要用於filter或output階段。
二、logstash編碼插件(Codec)
前面的例子中,其實咱們就已經用過編碼插件codec了,就是這個rubydebug,它就是一種codec。
編碼插件(codec)能夠在logstash輸入或輸出時處理不一樣類型的數據,同時,還能夠更好更方便的與其餘自定義格式的數據產品共存,好比:fluent、netflow、collectd等通用數據格式的其餘產品。所以,logstash不僅是一個input-->filter-->output的數據流,並且是一個input-->decode-->filter-->encode-->output的數據流。
codec支持的編碼格式常見有plain、json、json_lines等,下面依次介紹:
一、codec插件之plain
plain是最簡單的編碼插件,你輸入什麼信息,就返回什麼信息,諸如上面的例子中的timestamp、type等都不會帶有:
修改一下配置文件:
input { stdin { } } output { stdout { codec => plain } }
如今咱們啓動一下:
[root@::172.31.22.29 /etc/logstash/conf.d]#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/l1.conf Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties2019-01-22T06:10:14.161Z ip-172-31-22-29.ec2.internal hello word #在此輸入信息 2019-01-22T06:10:19.382Z ip-172-31-22-29.ec2.internal hello word
二、codec插件之json、json_lines
有時候logstash採集的日誌是JSON格式,那咱們能夠在input字段加入codec => json來進行解析,這樣就能夠根據具體內容生成字段,方便分析和儲存。若是想讓logstash輸出爲json格式,能夠在output字段加入codec=>json。下面是一個包含json編碼的時間配置文件:
input { stdin { } } output { stdout { codec => json } }
啓動一下:
[root@:172.31.22.29 /etc/logstash/conf.d]#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/l1.conf Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties hello word #輸入此行信息 {"host":"ip-172-31-22-29.ec2.internal","@version":"1","message":"hello word","@timestamp":"2019-01-22T06:27:27.191Z"}
你會發現插件是json的時候,。他會自帶一些信息,諸如host、@version、@timestamp。json的每一個字段都是key:value格式,多個字段之間經過逗號分隔。這種輸出比較長,所以咱們採用json_lines編碼格式稍微好一點。
2.一、咱們演示一下在input裏面設置json格式會怎麼輸入呢?
input { stdin { codec => json } } output { stdout { } }
接下來啓動一下服務:
[root@::172.31.22.29 /etc/logstash/conf.d]#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/l1.conf Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties {"message":"hello word","@version":"1","@timestamp":"2019-01-22T06:32:56.973Z","host":"ip-172-31-22-29.ec2.internal"} { "host" => "ip-172-31-22-29.ec2.internal", "@timestamp" => 2019-01-22T06:32:56.973Z, "@version" => "1", "message" => "hello word" }
這裏就是說當我輸入紅色方框裏面的內容的時候,這裏我輸入的是一行JSON格式,而後系統就會返回給我信息。