最近公司想要統一管理各個項目的日誌,也爲以後日誌可視化查詢做一個鋪墊。經過篩選,選擇了fluentd來做日誌的收集轉發工作,預想利用EFK來做日誌收集、查詢、可視化的方案。
啥?你問我爲啥不用Logstash,可參考文章Fluentd vs. Logstash: A Comparison of Log Collectors
,兩者差異並不大,Fluentd所佔內存較小、社區更活躍。
Fluentd是什麼?能解決什麼問題?
官網簡介: Fluentd是一個用於統一日誌層的開源數據收集器。Fluentd允許您統一數據收集和使用,以便更好地使用和理解數據。Fluentd是雲端原生計算基金會(CNCF)的成員項目之一,遵循Apache 2 License協議
這我們應用中,Fluentd負責從遊戲服務器收集日誌信息,將數據流交給後續數據存盤、查詢工具。換句話說,Fluentd不負責生產數據、不負責存儲數據,只是數據的搬運工。
- 使用JSON進行統一日誌記錄:Fluentd嘗試儘可能地將數據結構化爲JSON:這允許Fluentd 統一處理日誌數據的所有方面:收集,過濾,緩衝和跨多個源和目標(統一日誌層)輸出日誌。使用JSON可以更輕鬆地進行下游數據處理,因爲它具有足夠的結構,可以在保留靈活模式的同時進行訪問。
- 可插拔架構:Fluentd擁有靈活的插件系統,允許社區擴展其功能。我們的500多個社區貢獻插件連接了數十個數據源和數據輸出。通過利用插件,您可以立即開始更好地使用日誌。
- 所需的資源較少: Fluentd是用C語言和Ruby組合編寫的,只需要很少的系統資源。vanilla實例運行30-40MB內存,可處理13,000個事件/秒/核心。
- 內置可靠性:Fluentd支持基於內存和文件的緩衝,以防止節點間數據丟失。Fluentd還支持強大的故障轉移功能,可以設置爲高可用性。
注:fluentd-benchmark 對簡單數據2014-02-20 17:20:55 +0900 [info]: plugin:out_flowcounter_simple count:500 indicator:num unit:second
測壓結果是157148次/s
Fluentd解決數據流流向混亂的問題,通過在兩者之間提供統一的日誌記錄層,從後端系統中分離數據源。
爲什麼要用Fluentd?
- 簡單易用且靈活
- 開源
- 久經考驗的可靠性和性能:5,000多家數據驅動型公司依靠Fluentd通過更好地使用和了解他們的日誌數據來區分他們的產品和服務。
- 活躍的社區
- 與Logstash相比佔用內存更少、社區更活躍,兩者比較可參考Fluentd vs. Logstash: A Comparison of Log Collectors
人氣情況:
- github fluent/fluentd start 6.8k
- npm fluent-logger weekly downloads 11,493
Fluentd的用戶:
- Atlassian
- Microsoft
- amazon
- LINE
- PPTV
- …
fluentd安裝
fluentd安裝、啓動可參考Fluent doc
Fluentd配置
- source: 數據源配置,可接受log-tail、http、tcp、udp等方式數據,
- filter: 數據過濾配置,對匹配的tag進行過濾
- match: 數據輸出配置,對匹配的tag進行輸出設置
<source>
@type tcp
tag tcp.events # required
<parse>
@type regexp
expression /^(?<field1>\d+):(?<field2>\w+)$/
</parse>
port 5170 # optional. 5170 by default
bind 0.0.0.0 # optional. 0.0.0.0 by default
delimiter \n # optional. \n (newline) by default
</source>
Example input:
$ echo '123456:awesome' | netcat 0.0.0.0 5170
Parsed result like below:
{"field1":"123456","field2":"awesome}
## built-in TCP input
## @see http://docs.fluentd.org/articles/in_forward
<source>
@type forward
@id input_forward
<security>
self_hostname input.local
shared_key liang_handsome
</security>
</source>
<filter example.*.*>
@type grep
regexp1 levelStr (INFO|WARN|ERROR)
</filter>
# Match events tagged with "myapp.access" and
# store them to /var/log/fluent/access.%Y-%m-%d
# Of course, you can control how you partition your data
# with the time_slice_format option.
<match example.*.*>
@type file
path E:\software\fluentd\td-agent\log\output_file
</match>
fluentd更多配置請參考官網:https://docs.fluentd.org/v1.0/articles/config-file
fluent-logger配置
import {configure, getLogger, shutdown} from 'log4js'
const fluentAppender = configure({
appenders: {
"fluent": {
"type": "log4js-fluent-appender",
"tag_prefix": "example.your_keys",
"options": {
"levelTag": true,
"host": "localhost",
"port": 24224,
"timeout": 3.0,
"reconnectInterval": 600000,
"security": {
"clientHostname": "client",
"sharedKey": "liang_handsome"
}
}
}
},
categories: {
default: {
appenders: ['fluent'],
level: 'info'
}
}
});
如上配置,fluent-logger根據host、port連接fluentd,sharedKey作爲連接認證
logger.info({log_type: "create-room", uuid: 1112, room_id: 234, config: {cards: 16, chairs: 3}});
fluentd輸出爲:
2018-10-18T10:50:38+08:00 example.your_keys.INFO {"timestamp":1539831038583.0,"category":"default","levelInt":20000,"levelStr":"INFO","context":{},"data":"log { log_type: 'create-room', uuid: 1112, room_id: 234 }"}
JavaScript fluent_logger緩存測試:
- 在fluentd關閉的情況下,logger輸出20條日誌,開啓fluentd,fluent-logger會自動連接上fluentd,並將緩存的20條log發送至fluentd
- 正常連接fluentd,輸出5條log。然後關閉fluentd,繼續輸出15條log,啓動fluentd,fluent-logger自動連接上fluentd,並將緩存的15條log發送至fluentd
以上測試表明fluentd-logger在與fluentd丟失連接時,相關log暫先會緩存起來,並在重連時將緩存的log發送至fluentd。這個機制相當優秀,大大增加了安全性,不過要注意緩存是佔用內存的,如果長時間連接不上fluentd,有內存耗盡的風險。
日誌解決方案實戰
可參考文檔:基於Elasticsearch+Fluentd+Kibana的日誌收集分析系統搭建與應用
未來展望
fluentd收集數據,可輸出到hadoop中,利用數據做數據挖掘,可以實現很多有價值的目標。比如:
- 監測用戶行爲,針對流失較高的點,優化流失率,提高留存
- 監測消費行爲,針對性營銷,增加收入
- 異常檢測,發現數據異常情況,第一時間發現服務器邏輯漏洞
- 消費數據挖掘,將消費者分類,同類消費者商品推薦
- 發現即將流失客戶,重點給與相關優惠吸引策略
- 發現核心用戶,重點關注
- …
參考資料
Fluent
fluentd-benchmark
Fluent doc
基於Elasticsearch+Fluentd+Kibana的日誌收集分析系統搭建與應用
Fluentd vs. Logstash: A Comparison of Log Collectors
個人主頁:http://liangiter.top