Logstash不只是一個input|filter|output
的數據流,而是一個input|decode|filter|encode|output
的數據流。
codec就是用來decode,encode 事件的。所以codec常用在input和output中
常用的codec插件有plain,json,multiline等
plain插件:
主要用於事件之間沒有分隔的純文本。
使用:
input {
stdin {
codec => plain {} } }
示例:
logstash事件output到kafka默認的codec為json,如果設置codec為plain,除了message數據之外還會有一個主機名和時間戳的字段生成,如果只需要message字段,配置如下:
output {
kafka {
codec => plain { format => "%{message}" } } }
json插件:
如果數據為json格式,可直接使用該插件,從而省掉filter/grok的配置,降低過濾器的cpu消耗
使用:
input {
stdin {
codec => json } }
multiline插件:
用於合並多行數據
有些時候,應用程序調試日志會包含非常豐富的內容,為一個事件打印出很多行內容。這種日志通常都很難通過命令行解析的方式做分析。multiline插件用於解決此類問題。
示例:
tomcat的日志catalina.out有很多調試的日志,日志都以時間戳格式"20-Apr-2016 11:29:28.535"開頭,那么我們可以配置如下:
input {
file{ path => "/app/elk/logstash-5.6.11-access/llqlogs/5.out" tags => ["api-core"] codec => multiline { pattern => "^\d{2}\:\d{2}\:\d{2}\.\d{3}" auto_flush_interval => 10 negate => true what => "previous" } stat_interval => "1" } }
pattern為正則表達式匹配
negate為布爾類型,true表示否定正則表達式,即不匹配正則表達式。false為匹配正則表達式。默認值為false
what表示如果正則匹配與否,事件屬於上一個或者下一個事件。有兩個值可選previous(上一個)或者next(下一個)
auto_flush_interval表示當多長時間沒有新的數據,之前積累的多行數據轉換為一個事件。這里的10表示10秒
以上的配置可以解釋為:不匹配pattern時間戳格式開頭的行數據,都歸屬到上一個事件中,即在下一個匹配的時間戳出現之前的所有行的輸出都屬於同一個事件,從而達到合並多行的目的,同時等待10秒沒有新數據產生,那么最后一個時間戳格式后的所有行數據就是最后一個事件。