Logstash使用配置
運(yùn)行:bin/logstash -f /home/logstash.conf
logstash.conf
#整個(gè)配置文件分為三部分:input,filter,output
input {
#輸入
}
filter{
#過(guò)濾匹配
}
output {
#輸出
}
1殉摔、input配置
1.1 file{}(文件讀缺雒)
監(jiān)聽(tīng)文件變化抓韩,記錄一個(gè)叫.sincedb的數(shù)據(jù)庫(kù)文件來(lái)跟蹤被監(jiān)聽(tīng)的日志文件的當(dāng)前讀取位(也就是時(shí)間戳)
格式:
input {
#file可以多次使用吮成,也可以只寫(xiě)一個(gè)file而設(shè)置它的path屬性配置多個(gè)文件實(shí)現(xiàn)多文件監(jiān)控
file {
path =>["/var/log/access.log", "/var/log/message"]#監(jiān)聽(tīng)文件路徑
type => "system_log"#定義事件類型
start_position =>"beginning"#檢查時(shí)間戳
}
}
參數(shù)說(shuō)明:
exclude:排除掉不想被監(jiān)聽(tīng)的文件
stat_interval:logstash每隔多久檢查一次被監(jiān)聽(tīng)文件狀態(tài)(是否有更新)婆咸,默認(rèn)是1秒。
start_position:logstash默認(rèn)是從結(jié)束位置開(kāi)始讀取文件數(shù)據(jù)婴削,也就是說(shuō)logstash進(jìn)程會(huì)以類似tail -f的形式運(yùn)行徙硅。如果你是要導(dǎo)入原有數(shù)據(jù),把這個(gè)設(shè)定改成“beginning”焰情,logstash進(jìn)程就按時(shí)間戳記錄的地方開(kāi)始讀取陌凳,如果沒(méi)有時(shí)間戳則從頭開(kāi)始讀取,有點(diǎn)類似cat内舟,但是讀到最后一行不會(huì)終止冯遂,而是繼續(xù)變成tail -f。
1.2 codec(定義編碼類型)
優(yōu)化建議:直接輸入預(yù)定義好的JSON數(shù)據(jù)谒获,這樣就可以省略掉filter/grok配置蛤肌,從而減輕過(guò)濾器logstash的CPU負(fù)載消耗;
配置文件示例:
input {
file {
type =>"access_u_ex"
#添加自定義字段
add_field => {"fromhost"=>"EIR"}
#監(jiān)聽(tīng)文件的路徑
path =>"D:/java/logs/test/test1*"
#排除不想監(jiān)聽(tīng)的文件
exclude =>"test13.log"
#監(jiān)聽(tīng)文件的起始位置
start_position =>"beginning"
#增加標(biāo)簽
#tags =>
"tag1"
#設(shè)置多長(zhǎng)時(shí)間掃描目錄批狱,發(fā)現(xiàn)新文件
#discover_interval=> 15
#設(shè)置多長(zhǎng)時(shí)間檢測(cè)文件是否修改
#stat_interval
=> 1
codec => multiline {
charset =>"GB2312"
patterns_dir => ["d:/java/logstash-2.3.4/bin/patterns"]
pattern =>"^%{SECOND_TIME}"
negate =>true
what =>"previous"
}
}
}
從上到下裸准,解釋下配置參數(shù)的含義。
file :讀取文件赔硫。
path :日志文件絕對(duì)路徑(只支持文件的絕對(duì)路徑)炒俱。
type :定義類型,以后的filter、output都會(huì)用到這個(gè)屬性权悟。
add_field:添加字段砸王,盡量不要與現(xiàn)有的字段重名。重名的話可能會(huì)有不同錯(cuò)誤出現(xiàn)峦阁。
start_position:從什么位置開(kāi)始讀取文件谦铃,默認(rèn)是結(jié)束位置。如果要導(dǎo)入原有數(shù)據(jù)榔昔,把這個(gè)設(shè)定改為beginning .
discover_interval:設(shè)置多長(zhǎng)時(shí)間檢查一個(gè)被監(jiān)聽(tīng)的path下面是否有新文件驹闰。默認(rèn)時(shí)間是15秒.
exclude:不想監(jiān)聽(tīng)的文件排除出去。
stat_interval:設(shè)置多久時(shí)間檢查一次被監(jiān)聽(tīng)的文件(是否有更新)撒会,默認(rèn)是1秒嘹朗。
說(shuō)明:
a、有時(shí)候path可能需要配置多個(gè)路徑:
path => ["D:/java/logs/test/test1*","D:/java/logs/test/test2*"]
b诵肛、add_field添加字段時(shí)屹培,想判斷要添加的字段是否存在,不存在時(shí)添加
if![field1]{
mutate{
add_field=> {"field1" => "test1"}
}
}
codec編碼插件
logstash實(shí)際上是一個(gè)input | codec | filter | codec |
output的數(shù)據(jù)流。codec是用來(lái)decode怔檩、encode事件的惫谤。
Multiline合并多行數(shù)據(jù)
Multiline有三個(gè)設(shè)置比較重要:pattern、negate珠洗、what .
pattern:必須設(shè)置,String類型若专,沒(méi)有默認(rèn)值许蓖。匹配的是正則表達(dá)式。上面配置中的含義是:通過(guò)SECOND_TIME字段與日志文件匹配调衰,判斷文件開(kāi)始位置膊爪。
negate:boolean類型,默認(rèn)為false .如果沒(méi)有匹配嚎莉,否定正則表達(dá)式米酬。
what:必須設(shè)置,可以設(shè)置為previous或next .(ps:還沒(méi)弄清楚兩者之間的關(guān)系趋箩,目前我用的都是previous )赃额。
根據(jù)上面的配置,還有兩個(gè)設(shè)置:charset叫确、patterns_dir跳芳。
charset :一般都知道是編碼,這個(gè)就不多說(shuō)了竹勉。
patterns_dir:從配置中看到的是一個(gè)文件路徑飞盆。
2、filter過(guò)濾器配置
2.1 data(時(shí)間處理)
用來(lái)轉(zhuǎn)換日志記錄中的時(shí)間字符串,變成LogStash::Timestamp對(duì)象吓歇,然后轉(zhuǎn)存到@timestamp字段里孽水。
注意:因?yàn)樵谏院蟮膐utputs/elasticsearch中index常用的%{+YYYY.MM.dd}這種寫(xiě)法必須讀取@timestamp數(shù)據(jù),所以一定不要直接刪掉這個(gè)字段保留自己的時(shí)間字段城看,而是應(yīng)該用filters/date轉(zhuǎn)換后刪除自己的字段女气!至于elasticsearch中index使用%{+YYYY.MM.dd}這種寫(xiě)法的原因后面會(huì)說(shuō)明。
格式:
filter{
grok {
match =>["message", "%{HTTPDATE:logdate}"]
}
date {
match=> ["logdate", "dd/MMM/yyyy:HH:mm:ss Z"]
}
}
2.2 grok(正則匹配)
語(yǔ)法格式如下:
%{正則表達(dá)式或正則子句:你要賦值的變量名}
filter{
grok {
match => [ "message","\s+(?\d+?)\s+" ]#跟python的正則有點(diǎn)差別
}
}
%{語(yǔ)法:語(yǔ)義}
“語(yǔ)法”指的就是匹配的模式析命,例如使用NUMBER模式可以匹配出數(shù)字主卫,IP則會(huì)匹配出127.0.0.1這樣的IP地址:
%{NUMBER:lasttime}%{IP:client}
默認(rèn)情況下,所有“語(yǔ)義”都被保存成字符串鹃愤,你也可以添加轉(zhuǎn)換到的數(shù)據(jù)類型
%{NUMBER:lasttime:int}%{IP:client}
目前轉(zhuǎn)換類型只支持int和float
優(yōu)化建議:如果把“message”里所有的信息都grok到不同的字段了簇搅,數(shù)據(jù)實(shí)質(zhì)上就相當(dāng)于是重復(fù)存儲(chǔ)了兩份。所以可以用remove_field參數(shù)來(lái)刪除掉message字段软吐,或者用overwrite參數(shù)來(lái)重寫(xiě)默認(rèn)的message字段瘩将,只保留最重要的部分。
filter {
grok {
patterns_dir =>"/path/to/your/own/patterns"
match => {
"message" =>"%{SYSLOGBASE} %{DATA:message}"
}
overwrite => ["message"]
}
}
filter {
grok {
match => ["message", "%{HTTPDATE:logdate}"]
remove_field =>["logdate"]
}
}
Logstash內(nèi)置正則文件:
/home/logstash-5.2.1/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.0.2/patterns/grok-patterns
可以在此文件中進(jìn)行添加項(xiàng)凹耙;
覆蓋-- overwrite
使用Grok的overwrite參數(shù)也可以覆蓋日志中的信息
filter {
grok {
match =>{ "message" => "%{SYSLOGBASE} %{DATA:message}" }
overwrite=> [ "message" ]
}
}
日志中的message字段將會(huì)被覆蓋
2.3kv
將數(shù)據(jù)源轉(zhuǎn)換成鍵值對(duì)姿现,并創(chuàng)建相對(duì)的field。比如傳入“a=111&b=2222&c=3333”肖抱,輸出的時(shí)候备典,a,b意述,c會(huì)被創(chuàng)建成三個(gè)field提佣,這樣做的好處是,當(dāng)需要查詢某一個(gè)參數(shù)的時(shí)候可直接查詢荤崇,而不是把一個(gè)字符串搜索出來(lái)再做解析拌屏。
kv {
source => "field_name"
field_split => "&?"
}
2.4 IP位置插件GeoIP(地址查詢歸類)--(態(tài)勢(shì)感知項(xiàng)目中攻擊數(shù)據(jù)IP轉(zhuǎn)換可用)
GeoIP是最常見(jiàn)的免費(fèi)IP地址歸類查詢庫(kù),同時(shí)也有收費(fèi)版可以采購(gòu)术荤。GeoIP庫(kù)可以根據(jù)IP地址提供對(duì)應(yīng)的地域信息倚喂,包括國(guó)別,省市瓣戚,經(jīng)緯度等端圈,對(duì)于可視化地圖和區(qū)域統(tǒng)計(jì)非常有用。
使用方法:
filter {
geoip{
source =>"clientip"
database =>"/etc/logstash/GeoLiteCity.dat"#需去官網(wǎng)下載ip庫(kù)放到本地
}
}
示例:
filter {
geoip {
source =>"message"#如果能聯(lián)網(wǎng)可查詢?cè)诰€ip庫(kù)
}
}
運(yùn)行結(jié)果:
{
"message"=> "183.60.92.253",
"@version"=> "1",
"@timestamp"=> "2014-08-07T10:32:55.610Z",
"host"=> "raochenlindeMacBook-Air.local",
"geoip"=> {
"ip"=> "183.60.92.253",
"country_code2"=> "CN",
"country_code3"=> "CHN",
"country_name"=> "China",
"continent_code"=> "AS",
"region_name"=> "30",
"city_name"=> "Guangzhou",
"latitude"=> 23.11670000000001,
"longitude"=> 113.25,
"timezone"=> "Asia/Chongqing",
"real_region_name"=> "Guangdong",
"location"=> [
[0]113.25,
[1]23.11670000000001
]
}
}
注:geoip插件的“source”字段可以是任一處理后的字段子库,比如“clientip”枫笛,但是字段內(nèi)容卻需要小心!geoip庫(kù)內(nèi)只存有公共網(wǎng)絡(luò)上的IP信息刚照,查詢不到結(jié)果的刑巧,會(huì)直接返回null喧兄,而logstash的geoip插件對(duì)null結(jié)果的處理是:不生成對(duì)應(yīng)的geoip.字段。
所以在測(cè)試時(shí)啊楚,如果使用了諸如127.0.0.1, 172.16.0.1,
182.168.0.1, 10.0.0.1等內(nèi)網(wǎng)地址吠冤,會(huì)發(fā)現(xiàn)沒(méi)有對(duì)應(yīng)輸出!
GeoIP庫(kù)數(shù)據(jù)較多恭理,如果不需要這么多內(nèi)容拯辙,可以通過(guò)fields選項(xiàng)指定自己所需要的。下例為全部可選內(nèi)容:
filter {
geoip {
fields => ["city_name","continent_code","country_code2","country_code3","country_name","dma_code","ip","latitude","longitude","postal_code","region_name","timezone"]
}
}
選項(xiàng)
上面我們看到了source和fields兩個(gè)選項(xiàng)颜价,geoip還提供了下列選項(xiàng):
2.5 drop
drop可以跳過(guò)某些不想統(tǒng)計(jì)的日志信息涯保,當(dāng)某條日志信息符合if規(guī)則時(shí),該條信息則不會(huì)在out中出現(xiàn)周伦,logstash將直接進(jìn)行下一條日志的解析夕春。
if [field_name] == "value" {
drop {}
}
2.6重命名-- rename
對(duì)于已經(jīng)存在的字段,重命名其字段名稱
filter {
mutate {
rename => ["syslog_host", "host"]
}
}
2.7更新字段內(nèi)容– update
更新字段內(nèi)容专挪,如果字段不存在及志,不會(huì)新建
filter{
mutate {
update =>{ "sample" => "My new message" }
}
}
2.8替換字段內(nèi)容– replace
與update功能相同,區(qū)別在于如果字段不存在則會(huì)新建字段
filter {
mutate {
replace => { "message" =>"%{source_host}: My new message" }
}
}
2.9數(shù)據(jù)類型轉(zhuǎn)換– convert
filter{
mutate {
convert =>["request_time", "float"]
}
}
2.10文本替換– gsub
gsub提供了通過(guò)正則表達(dá)式實(shí)現(xiàn)文本替換的功能
filter {
mutate {
gsub => [
# replace all forward slashes with underscore
"fieldname","/", "_",
# replace backslashes, question marks, hashes, andminuses
#with a dot "."
"fieldname2","[\\?#-]", "."
]
}
}
2.11大小寫(xiě)轉(zhuǎn)換-- uppercase寨腔、lowercase
filter {
mutate {
uppercase => ["fieldname" ]
}
}
2.12去除空白字符-- strip
類似php中的trim速侈,只去除首尾的空白字符
filter {
mutate{
strip=> ["field1", "field2"]
}
}
2.13刪除字段-- remove、remove_field
remove不推薦使用迫卢,推薦使用remove_field
filter {
mutate{
remove_field=> [ "foo_%{somefield}" ]
}
}
2.14分割字段– split
將提取到的某個(gè)字段按照某個(gè)字符分割
filter {
mutate {
split => ["message","|"]
}
}
針對(duì)字符串"123|321|adfd|dfjld*=123"倚搬,可以看到輸出結(jié)果:
{
"message" =>[
[0] "123",
[1] "321",
[2] "adfd",
[3]"dfjld*=123"
],
"@version" =>"1",
"@timestamp"=> "2014-08-20T15:58:23.120Z",
"host" =>"raochenlindeMacBook-Air.local"
}
2.15聚合數(shù)組– join
將類型為array的字段中的array元素使用指定字符為分隔符聚合成一個(gè)字符串
如我們可以將split分割的結(jié)果再重新聚合起來(lái):
filter {
mutate {
split =>["message", "|"]
}
mutate {
join =>["message", ","]
}
}
輸出:
{
"message" =>"123,321,adfd,dfjld*=123",
"@version" =>"1",
"@timestamp"=> "2014-08-20T16:01:33.972Z",
"host" =>"raochenlindeMacBook-Air.local"
}
2.16合并數(shù)組– merge
對(duì)于幾個(gè)類型為array或hash或string的字段,我們可以使用merge合并
filter {
mutate {
merge => ["dest_field", "added_field" ]
}
}
需要注意的是乾蛤,array和hash兩個(gè)字段是不能merge的
2.17時(shí)間分割– split
mutiline讓logstash將多行數(shù)據(jù)變成一個(gè)事件每界,當(dāng)然了,logstash同樣支持將一行數(shù)據(jù)變成多個(gè)事件
logstash提供了split插件幻捏,用來(lái)把一行數(shù)據(jù)拆分成多個(gè)事件
示例:
filter {
split {
field => "message"
terminator => "#"
}
}
運(yùn)行結(jié)果:
對(duì)于"test1#test2",上述logstash配置將其變成了下面兩個(gè)事件:
{
"@version":"1",
"@timestamp":"2014-11-18T08:11:33.000Z",
"host":"web121.mweibo.tc.sinanode.com",
"message":"test1"
}
{
"@version":"1",
"@timestamp":"2014-11-18T08:11:33.000Z",
"host":"web121.mweibo.tc.sinanode.com",
"message":"test2"
}
需要注意的是命咐,當(dāng)split插件執(zhí)行結(jié)束后篡九,會(huì)直接進(jìn)入output階段,其后的所有filter都將不會(huì)被執(zhí)行
2.18 json
對(duì)于json格式的log醋奠,可以通過(guò)codec的json編碼進(jìn)行解析榛臼,但是如果記錄中只有一部分是json,這時(shí)候就需要在filter中使用json解碼插件
示例:
filter {
json{
source=> "message"
target=> "jsoncontent"
}
}
運(yùn)行結(jié)果:
{
"@version":"1",
"@timestamp":"2014-11-18T08:11:33.000Z",
"host":"web121.mweibo.tc.sinanode.com",
"message":"{\"uid\":3081609001,\"type\":\"signal\"}",
"jsoncontent": {
"uid":3081609001,
"type":"signal"
}
}
上面的例子中窜司,解析結(jié)果被放到了target所指向的節(jié)點(diǎn)下沛善,如果希望將解析結(jié)果與log中其他字段保持在同一層級(jí)輸出,那么只需要去掉target即可:
{
"@version":"1",
"@timestamp":"2014-11-18T08:11:33.000Z",
"host":"web121.mweibo.tc.sinanode.com",
"message":"{\"uid\":3081609001,\"type\":\"signal\"}",
"uid":3081609001,
"type":"signal"
}
3塞祈、output
output {
stdout{ codec=>rubydebug}#直接輸出金刁,調(diào)試用起來(lái)方便
#輸出到redis
redis {
host => '10.120.20.208'
data_type => 'list'
key => '10.99.201.34:access_log_2016-04'
}
#輸出到ES
elasticsearch {
hosts =>"192.168.0.15:9200"
index => "%{sysid}_%{type}"
document_type => "%{daytag}"
}
}
附:
1、Grok正則在線驗(yàn)證http://grokdebug.herokuapp.com/
2、Logstash配置https://my.oschina.net/shawnplaying/blog/670217
3尤蛮、Logstash最佳實(shí)踐http://udn.yyuap.com/doc/logstash-best-practice-cn/index.html