Fluentd簡介

最近公司想要統一管理各個項目的日誌,也爲以後日誌可視化查詢做一個鋪墊。經過篩選,選擇了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 log
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章