每個(gè) logstash 過(guò)濾插件正歼,都會(huì)有四個(gè)方法叫add_tag,remove_tag,add_field和remove_field。它們?cè)诓寮^(guò)濾匹配成功時(shí)生效。
語(yǔ)法
Logstash 設(shè)計(jì)了自己的 DSL —— 有點(diǎn)像 Puppet 的 DSL,或許因?yàn)槎际怯?Ruby 語(yǔ)言寫(xiě)的吧 —— 包括有區(qū)域界弧,注釋?zhuān)瑪?shù)據(jù)類(lèi)型(布爾值,字符串搭综,數(shù)值垢箕,數(shù)組,哈希)兑巾,條件判斷条获,字段引用等。
區(qū)段
Logstash 用{}來(lái)定義區(qū)域蒋歌。區(qū)域內(nèi)可以包括插件區(qū)域定義月匣,你可以在一個(gè)區(qū)域內(nèi)定義多個(gè)插件。插件區(qū)域內(nèi)則可以定義鍵值對(duì)設(shè)置奋姿。示例如下:
input {
? ? ? ? ? ? ?stdin {}
? ? ? ? ? ? ?syslog {}
}
數(shù)據(jù)類(lèi)型
Logstash 支持少量的數(shù)據(jù)值類(lèi)型:
bool
debug => true
string
host => "hostname"
number
port => 514
array
match => ["datetime", "UNIX", "ISO8601"]
hash
options => {
key1 => "value1",
key2 => "value2"
}
注意:如果你用的版本低于 1.2.0锄开,哈希的語(yǔ)法跟數(shù)組是一樣的,像下面這樣寫(xiě):
match => [ "field1", "pattern1", "field2", "pattern2" ]
字段引用(field reference)
字段是Logstash::Event對(duì)象的屬性称诗。我們之前提過(guò)事件就像一個(gè)哈希一樣萍悴,所以你可以想象字段就像一個(gè)鍵值對(duì)。
小貼士:我們叫它字段寓免,因?yàn)?Elasticsearch 里是這么叫的癣诱。
如果你想在 Logstash 配置中使用字段的值,只需要把字段的名字寫(xiě)在中括號(hào)[]里就行了袜香,這就叫字段引用撕予。
對(duì)于嵌套字段(也就是多維哈希表,或者叫哈希的哈希)蜈首,每層的字段名都寫(xiě)在[]里就可以了实抡。比如欠母,你可以從 geoip 里這樣獲取longitude值(是的,這是個(gè)笨辦法吆寨,實(shí)際上有單獨(dú)的字段專(zhuān)門(mén)存這個(gè)數(shù)據(jù)的):
[geoip][location][0]
小貼士:logstash 的數(shù)組也支持倒序下標(biāo)赏淌,即[geoip][location][-1]可以獲取數(shù)組最后一個(gè)元素的值。
Logstash 還支持變量?jī)?nèi)插啄清,在字符串里使用字段引用的方法是這樣:
"the longitude is %{[geoip][location][0]}"
條件判斷(condition)
Logstash從 1.3.0 版開(kāi)始支持條件判斷和表達(dá)式六水。
表達(dá)式支持下面這些操作符:
==(等于),!=(不等于),<(小于),>(大于),<=(小于等于),>=(大于等于)
=~(匹配正則),!~(不匹配正則)
in(包含),not in(不包含)
and(與),or(或), nand(非與), xor(非或)
()(復(fù)合表達(dá)式),!()(對(duì)復(fù)合表達(dá)式結(jié)果取反)
通常來(lái)說(shuō),你都會(huì)在表達(dá)式里用到字段引用辣卒。為了盡量展示全面各種表達(dá)式掷贾,下面虛擬一個(gè)示例:
if "_grokparsefailure" not in [tags] {
} else if [status] !~ /^2\d\d/ or ( [url] == "/noc.gif" nand [geoip][city] != "beijing" ) {
} else {
}
命令行參數(shù)
Logstash 提供了一個(gè) shell 腳本叫l(wèi)ogstash方便快速運(yùn)行。它支持以下參數(shù):
-e
意即執(zhí)行荣茫。我們?cè)?"Hello World" 的時(shí)候已經(jīng)用過(guò)這個(gè)參數(shù)了胯盯。事實(shí)上你可以不寫(xiě)任何具體配置,直接運(yùn)行bin/logstash -e ''達(dá)到相同效果计露。這個(gè)參數(shù)的默認(rèn)值是下面這樣:
input {
? ? ? ? ?stdin { }
}
output {
? ? ? ? ?stdout { }
}
Logstash使用input和output定義收集日志時(shí)的輸入和輸出的相關(guān)配置,本例中input定義了一個(gè)叫"stdin"的input憎乙,output定義一個(gè)叫"stdout"的output票罐。無(wú)論我們輸入什么字符,Logstash都會(huì)按照某種格式來(lái)返回我們輸入的字符泞边,其中output被定義為"stdout"并使用了codec參數(shù)來(lái)指定logstash輸出格式该押。
--config 或 -f
意即文件。真實(shí)運(yùn)用中阵谚,我們會(huì)寫(xiě)很長(zhǎng)的配置蚕礼,甚至可能超過(guò) shell 所能支持的 1024 個(gè)字符長(zhǎng)度。所以我們必把配置固化到文件里梢什,然后通過(guò)bin/logstash -f agent.conf這樣的形式來(lái)運(yùn)行奠蹬。
此外,logstash 還提供一個(gè)方便我們規(guī)劃和書(shū)寫(xiě)配置的小功能嗡午。你可以直接用bin/logstash -f /etc/logstash.d/來(lái)運(yùn)行囤躁。logstash 會(huì)自動(dòng)讀取/etc/logstash.d/目錄下所有*.conf的文本文件,然后在自己內(nèi)存里拼接成一個(gè)完整的大配置文件荔睹,再去執(zhí)行狸演。
注意:
logstash 列出目錄下所有文件時(shí),是字母排序的僻他。而 logstash 配置段的 filter 和 output 都是順序執(zhí)行宵距,所以順序非常重要。采用多文件管理的用戶(hù)吨拗,推薦采用數(shù)字編號(hào)方式命名配置文件满哪,同時(shí)在配置中婿斥,嚴(yán)謹(jǐn)采用if判斷限定不同日志的動(dòng)作。
--configtest 或 -t
意即測(cè)試翩瓜。用來(lái)測(cè)試 Logstash 讀取到的配置文件語(yǔ)法是否能正常解析受扳。Logstash 配置語(yǔ)法是用 grammar.treetop 定義的。尤其是使用了上一條提到的讀取目錄方式的讀者兔跌,尤其要提前測(cè)試勘高。
--log 或 -l
意即日志。Logstash 默認(rèn)輸出日志到標(biāo)準(zhǔn)錯(cuò)誤坟桅。生產(chǎn)環(huán)境下你可以通過(guò)bin/logstash -l logs/logstash.log命令來(lái)統(tǒng)一存儲(chǔ)日志华望。
--pipeline-workers 或 -w
運(yùn)行 filter 和 output 的 pipeline 線(xiàn)程數(shù)量。默認(rèn)是 CPU 核數(shù)仅乓。
--pipeline-batch-size 或 -b
每個(gè) Logstash pipeline 線(xiàn)程赖舟,在執(zhí)行具體的 filter 和 output 函數(shù)之前,最多能累積的日志條數(shù)夸楣。默認(rèn)是 125 條宾抓。越大性能越好,同樣也會(huì)消耗越多的 JVM 內(nèi)存豫喧。
--pipeline-batch-delay 或 -u
每個(gè) Logstash pipeline 線(xiàn)程石洗,在打包批量日志的時(shí)候,最多等待幾毫秒紧显。默認(rèn)是 5 ms讲衫。
--pluginpath 或 -P
可以寫(xiě)自己的插件,然后用bin/logstash --pluginpath /path/to/own/plugins加載它們孵班。
--verbose
輸出一定的調(diào)試日志涉兽。
--debug
輸出更多的調(diào)試日志。
設(shè)置文件
從 Logstash 5.0 開(kāi)始篙程,新增了$LS_HOME/config/logstash.yml文件枷畏,可以將所有的命令行參數(shù)都通過(guò) YAML 文件方式設(shè)置。同時(shí)為了反映命令行配置參數(shù)的層級(jí)關(guān)系虱饿,參數(shù)也都改成用.而不是-了矿辽。
pipeline:
? ? ? ? ? workers:24
? ? ? ? ? batch:
? ? ? ? ? ? ? size:125
? ? ? ? ? ? ? delay:5