【GMOリサーチではエンジニアを募集中です】採用情報はこちら!

Fluentd の Docker のサンプルを動かしてみた話

Fluentd の Docker のサンプルを動かしてみた話

うちの会社では複数あるサーバのログ集約に Fluentd を使っている。 サーバが多数あってもログファイルが1個のサーバに集まっていればログを確認するときに便利だ。 いままではなんとなく見よう見まねで使っていたが、ここいらで一つ本家ドキュメントを読んでおこう。

ここだな…

https://docs.fluentd.org/

Fluentd とは

  • ログ集約と配布をやってくれるミドルウェア。
    • 複数のサーバでそれぞれ出力されるログを1台のサーバに集めてくれて便利。わざわざたくさんあるサーバにssh使ってログを見に行かなくて良い。
  • 多様な入力と出力の機能や、フィルタリングや、バッファリングの機能がある。
  • それぞれプラグインがあって、どこと繋げるとか抽出の機能を外付けできる。
    • 拡張性

設定でよく見かける 24224 ポートは forward というプラグインのデフォルトのポートだ。これはfluentd 間の通信で使われる。 例えば これ はJavaのロガーでロガーがfluentdサーバにログメッセージを送る。

でもこれ直接使うとアプリケーションから org.fluentd.logger.FluentLogger を直接使うことになるから、何らかのロガーのアペンダーとして提供されているほうが出力先を切り替えたいときに楽かもね。

Dockerも fluentd の機能を持っている。設定を入れると指定されたfluentdのサーバにログメッセージを送れる。https://docs.docker.com/config/containers/logging/fluentd/

1個のログメッセージをfluentdでは event と呼んでいる。event は タグと時刻とメッセージ内容で構成される。時刻はそのまま時刻だ。タグは eventの分類に使われる。メッセージはJSON形式になるらしい。https://docs.fluentd.org/quickstart/life-of-a-fluentd-event#event-structure

docker-compose でのサンプルを動かしてみる

うむうむなるほど。ドキュメントには動作するサンプルもあるな。https://docs.fluentd.org/container-deployment/docker-compose やってみよう。

これは EFK Stackの例らしい。 ElasticSearch, Fluentd, Kibanaでの分析基盤が動かせるのだな。 コードはここにあるからcloneして…と。

エラーになった。どうしてだ? web から fluentd に繋げないのか。 docker-compose.yaml はどうなっているかというと…

web のログ設定が

になっているな。これはさっき見たような docker が直接ログドライバーとして fluentd サーバにログを送る設定だ。 接続先と流すタグの設定をしている。

設定を変えて動かしてみる

接続先が localhost とはどういう意味だろう?というか、links を使っていてあまりよろしくないかもな。サービス全部同じネットワークに入れて、fluentd のIPアドレスを固定するように設定すればよいだろう。やってみよう。

https://docs.docker.com/compose/compose-file/compose-file-v3/#links

<<ドタドタバタリ>>

よしこれでどうだ。 linksやめて、efk_stack_network というネットワーク設定してIPアドレスを 10.10.10.10 に固定したぜ!(重要なところだけ記載。)

起動してみよう。

つながらない。いやいやいやそんなことはないぞ。試しに ping 打ってみるか。web がコケてるから一旦ログドライバー設定消して、もう一度起動しよう。まずは ping をインストールしてと…

ping 通るな…

もっと設定を変えて動かしてみる

じゃあなんでつながらない?コンテナの起動タイミング的な何かかな? 設定オプションでそれっぽいのないだろうか?

<<ドタドタバタリ>>

あ、 fluentd-async てのがあるな。メッセージはコネクションが確立されるまでバッファされます。か。

https://docs.docker.com/config/containers/logging/fluentd/#fluentd-async

設定してみよう。

さあどうかな?

おお起動した!その後のhttp アクセスもちゃんとKibana に拾われているぞ。これでいいんだ。

うーむなるほど。EFKの構成もこのぐらいの docker-compose.yml で作れるなら学習にもとっつきやすそうだ。

localhostはどこなのか

それにしても…もともとの設定だと接続先が localhost だったがこれはどういう意味なのだろう? web コンテナで fluentd のサービスなんか動いてないのに。

<<ドタドタバタリ>>

わかった!この記事によると localhost ってホスト側のOSを指すらしい。https://blg.dai-it-system.com/2021/09/docker_log_fluentd/ それで、ポートバインディングでホストのポート24224とfluentd のポート24224を繋いでいる。つまり通信が一旦 docker の外にでているのだ。そういうことだったのか!

まとめ

とにかく動かすことができた。設定ファイルの書式もわかってきた。次はfluentdをテスト用AWSアカウントで実際に立ててみよう。

続きはまた別の機会に。

開発ブログカテゴリの最新記事