2020年10月5日月曜日

fluent-logger を使って Ruby のログを直接ログサーバに転送する

概要

通常はログファイルに出力してそれを fluentd で処理して転送します
それでもいいのですが Ruby でアプリを書いている場合は fluent-logger を使うと普通のログを出力する感じでログを直接転送することができます
今回は簡単な使い方を紹介します

環境

  • macOS 10.15.7
  • Ruby 2.7.1p83
    • fluent-logger 0.9.0

インストール

  • bundle init
  • vim Gemfile
gem "fluent-logger"
  • bundle install

簡単なサンプル

とりあえずログを簡単なログを送るサンプルを作成します

  • vim app.rb
require 'fluent-logger'

log = Fluent::Logger::FluentLogger.new(nil, :host => 'localhost', :port => 24224)
unless log.post("myapp.access", {"agent" => "foo"})
  p log.last_error
end

myapp.access というタグで {"agent" => "foo"} という JSON のログを送ります
もしエラーになった場合は標準出力にエラーの内容を表示させます

動作確認: ログを受ける fluentd を立ち上げる

app.rb から送信されたログを受け取る fluentd を立ち上げます
今回は単純に受け取ってそれを標準出力に書き出すだけにします
すでにある場合はそれを使っても OK です
その場合は app.rb にある host や port の情報を書き換えましょう

  • vim fluent.conf
<source>
  @type forward
</source>

<match *.*>
  @type stdout
</match>
  • docker run --name fluentd -d -v $(pwd)/fluent.conf:/fluentd/etc/fluent.conf -p 24224:24224 fluentd -c /fluentd/etc/fluent.conf

これで起動します
以下のコマンドでログが来るか待機しておきましょう

  • docker logs -f fluentd

動作確認: 転送されているか確認する

あとはアプリを起動してログが表示されるか確認します

  • bundle exec ruby app.rb
2020-10-05 00:34:38.000000000 +0000 myapp.access: {"agent":"foo"}

こんな感じでログが表示されれば OK です

Tips: 転送先の fluentd が止まっている場合は

以下のようなログがアプリ側の標準出力に表示されると思います

E, [2020-10-05T09:36:01.091357 #11569] ERROR – : Failed to connect fluentd: Connection refused - connect(2) for "localhost" port 24224 E, [2020-10-05T09:36:01.091423 #11569] ERROR – : Connection will be retried. #<Errno::ECONNREFUSED: Connection refused - connect(2) for "localhost" port 24224> E, [2020-10-05T09:36:01.092207 #11569] ERROR – : FluentLogger: Can't send logs to localhost:24224: Connection refused - connect(2) for "localhost" port 24224

最後に

サクッと fluent-logger を試してみました
とりあえず使う分には簡単に使えそうです
エラーの場合にはログファイルに出力するなども簡単にできると思います
気になるのは負荷的な面かなと思います
ログを出力するたびに通信が発生しそうなのでログを大量に出力するアプリだとアプリがハングしないか気になりました

また Sinatra などのカスタムロガーにこれを使えば Web アプリのログも簡単に転送にできるようになりそうです
次回はそのあたりを検証してみようかなと思います

参考サイト

0 件のコメント:

コメントを投稿