背景
從某app里獲得了一堆日志轴脐,需要從日志中過濾信息膜楷,存入ES形真,然后再統(tǒng)計分析杉编。
原始數(shù)據(jù)
已經(jīng)通過kafka存入es,內(nèi)容結(jié)構(gòu)大致如下:
personID,groupID,logType,content
1,20,wx,{"signal":100}
1,20,wx,{"sys":"ios"}
2,20,wx,{"signal":10, "network": "4g"}
1,20,wx,{"signal":80}
日志索引存儲了四個字段咆霜,用戶ID(personID)邓馒,組ID(groupID),日志類型(logType)蛾坯,日志內(nèi)容(content)
其中绒净,日志內(nèi)容是JSON。每條日志里偿衰,存儲的content內(nèi)容格式不同,字段也不確定改览。
目標(biāo)
從日志數(shù)據(jù)中下翎,把和signal相關(guān)的數(shù)據(jù)過濾出來,進行統(tǒng)計分析宝当。
技術(shù)選型
- 通過logstash快速將es中匹配的數(shù)據(jù)導(dǎo)入新索引中
- 使用kibana進行目標(biāo)數(shù)據(jù)的初步統(tǒng)計分析
思路拆解
【1】
從日志數(shù)據(jù)中视事,過濾出content里的signal字段,字段是整形庆揩,數(shù)值理論上落在-100 ~ 100的區(qū)間里俐东。然后用一個索引:person_device_signal存儲起來。索引需要存儲兩個字段:personID, groupID, signal
然后就能用kibana對索引進行關(guān)于signal的各種平均值订晌,最值虏辫,方差等等的統(tǒng)計計算,也可以personID锈拨,groupID進行分桶然后再統(tǒng)計
【2】
logstash運行導(dǎo)入配置的命令是
./bin/logstash -f xxx.conf
【3】
logstash的導(dǎo)入配置.conf文件分為三個部分:
- input
- filter
- output
【4】input砌庄,對數(shù)據(jù)輸入源的定義。
在這里奕枢,輸入源是:es
先確認(rèn)查詢語句娄昆,找到所有匹配signal的
{
"query": {
"match": {
"content": "signal"
}
},
"sort": [ "_doc" ]
}
input {
elasticsearch {
hosts => "localhost"
index => "person_device_log"
query => '{"query": {"match": {"content": "signal"}},"sort": [ "_doc" ]}'
size => 500
scroll => "5m"
docinfo => true
}
}
【5】filter,對輸入的數(shù)據(jù)進行處理
filter {
json {
source => "content"
}
prune {
whitelist_names => [ 'personID', 'groupID', 'signal']
}
}
使用prune指定想要的字段才寫入新索引缝彬,避免json解析出來的其它附帶字段
【6】output指定對應(yīng)索引名稱
output {
elasticsearch {
hosts => "http://elasticsearch:9200"
index => "person_device_signal"
document_id => "%{id}"
}
stdout {}
}
注:document_id一定要寫上萌焰,保證數(shù)據(jù)不會因為重復(fù)執(zhí)行命令重復(fù)寫入