背景:
我們的日志是json類型,但是在寫入ES時變成一個message 字段string,這種將所有日志寫在一個string 類型時不利於分字段進行查找,並且沒發用kibana 平台使用ES的聚合分析功能。
由於業務的不同,打印的字段比較隨意,而寫入ES中的key最大值要求1000,這樣又不能把日志完全展開作為一個json 結構寫入ES
所以這里的策略是用logstash,將固定的某些字段展開變成ES中的一個key,其余各種自定義的字段完全寫入 message 中
主要用的插件
- json插件,從message 字符串中將所有字段全部變成json 結構體
json {
source => "message"
skip_on_invalid_json => true
}
2.將body字段 (json --> string) 變成字符串存儲(具體相應組件查看相關文檔)
json_encode {
source => "body"
}
3.配置白名單,過濾所有無用的字段
prune {
whitelist_names => ["^level$","time","^path$","^traceID$","^addr$","^elapse$","^msg$","^status$","^body$","^response$","^ret$","^message$","^fields$"]
}
這樣配置過后除了指定的字段外,所有的消息都存在message 中,又能保證ES中key 的有限個
轉來轉去肯定是存在一些性能損失的,但是沒有想到好辦法解決這種需求