概要
通常はログファイルに出力してそれを 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 件のコメント:
コメントを投稿