EFK(3) - Rails 與 Fluentd 的串接方法

幾種可以跟 Rails 串接的方式

  1. gem ‘fluent-logger’
    Centralize Logs from Ruby Applications

  2. 自定解析
    fluent/fluent-plugin-grok-parser: Fluentd’s Grok parser

  3. 使用 Rails-logger 來蒐集, 如果你的目標是讓 EFK 變成一個 log 整合系統,這個方式是你的最佳選項。搭配 act-fluent-logger-rails' lograge 這兩個 gem, 可以將你的 log 更加的組織化。詳細教學請參照下方連結:
    Collecting and Analyzing Ruby on Rails Logs | Fluentd

這篇我們採用的方式是 1,優點是可以自定義 log 的形式,缺點是需要自行設計 log 系統。如果你只是想把原本存在於 log/prodcution.log 搜集到 EFK Stack,那可以使用 3 的方式來整合 Rails-app 的 log。而如果你想蒐集 Rails 以外的 log 如 apache 或是 nginx 的 log,則可以使用 2 的方式。

Fluentd agent 與 Rails 的串接

step 1: 使用 Gem 安裝 Fluentd

這邊使用的方法是使用 gem 安裝,
配合 rvm 方便管理,不會污染環境

1
gem install fluentd -v "~> 0.12.0" --no-ri --no-rdoc

Error: 因為我的開發環境用的 Rails 版本較舊,bundler 使用的是 1.14.4,在開發的時候遇到錯誤訊息gems/bundler-1.14.4/lib/bundler/rubygems_ext.rb:45:in full_gem_path'
Solution:輸入 gem update --system 更新系統 gem 的版本。

step 2: 產生設定檔

輸入以下指令

1
fluentd --setup ./fluent

資料夾會變成這樣

1
2
3
4
5
$ tree .
.
└── fluent
├── fluent.conf
└── plugin

step 3: 啟動 fluentd

1
fluentd -c ./fluent/fluent.conf -vv &

輸入後 fluentd 就可以順利跑起來了

step 4: 測試 fluentd 功能是否正常

1
require 'fluent-logger'

初始化 Fluentd

1
Fluent::Logger::FluentLogger.open(nil, :host=>'localhost', :port=>24224)

來測試一下訊息

1
Fluent::Logger.post("fluentd.test.follow", {"from"=>"userA", "to"=>"userB"})

結果

1
2017-05-09 15:09:00 +0800 [warn]: fluent/agent.rb:170:emit: no patterns matched tag="fluentd.test.follow"

可以看到 fluentd 並沒有成功收到我們想記錄的 log,並發現警告訊息,原因是 Fluentd 蒐集 log pattern 並沒有包含 fluentd.test.follow

step 5: 讓 Fluentd 可以蒐集到我們要的 log pattern

來修改 Fluentd 的設定檔,打開設定檔:

1
vim ./fluent/fluent.conf

加入 pattern

1
2
3
4
<match fluentd.test.follow.**>
@type stdout
@id stdout_output
</match>

重新啟動 fluentd,再記錄一次 log 看看:

1
2
Fluent::Logger::FluentLogger.open(nil, :host=>'localhost', :port=>24224)
Fluent::Logger.post("fluentd.test.follow", {"from"=>"userA", "to"=>"userB"})

結果

1
2017-05-09 15:16:19 +0800 fluentd.test.follow: {"from":"userA","to":"userB"}

這樣就完成單機上的 fluentd-agent 與 Rails Application 的串接了。

介紹 Forward Input Plugin

Fluentd 蒐集 Rails 的 Log 的時候,並不是使用讀取檔案的方式。
而是使用 forward input plugin 來幫助蒐集。
forward input plugin 是一個可以蒐集 tcp 或是 utp 協定的 fluentd plugin。

forward Input Plugin - Fluentd

參考資料

Quickstart Guide - Fluentd
Installing Fluentd Using Ruby Gem - Fluentd
Centralize Logs from Ruby Applications - Fluentd

評論