実現したいこと以前、NginxのログをFluentdを用いてElasticsearchに送信する際は、アクセスログをデータボリュームに書き出しtailで読み込んでElasticsearchに送信する方法で実現していた。その際、オフィシャルのNginxコンテナのアクセスログの仕様について触れた。upをフォアグラウンドで実行していると見ることのできるログに、各コンテナで起きたログを表示するには標準出力、標準エラー出力に内容を書く必要がある。Nginxはアクセスログをログファイルに書きつつ標準出力に書き出す方法がないので、アクセスログを標準出力にシンボリックリンクすることで実現している。そのため/var/log/nginx/access.logにいくらログを書いてもコンテナ内にログは残らなくなっている。https://chulip.org/entry/2019/08/18/233205上記仕様を回避するため、ログファイルをわざわざ別名で書き出すようにする必要があった。そもそもデフォルトで標準出力にアクセスログが流れてくるのであればそれをそのままElasticsearchに渡してやればよいのでは?そうすれば、ログファイルに別名を付ける必要もないし、ログを読み込むためだけにデータボリュームを用意する必要もない。Loggingを使用してNginxコンテナのログをFluentdに渡してそのままElasticsearchに送信できるようにする。過去の記事で使用した環境に変更を加えていくのでdiffを記載していく。nginx>typeをforwardに変更。/myapp/public;ログファイルのファイル名を変更して標準出力、標準エラー出力にアクセスログが出力されるように。http-log:まず、loggingの設定を追加。次に、ログファイルを参照する必要がなくなったのでログファイル用のデータボリューム関連を削除。次に、fluentd-async-connect。upを行うと下記WARNINGが表示される。driverdocker-compose.ymlのdepends_onでnginxは依存していることを記述しているが、ただ単にコンテナの作成順序が保証されるだけで、サービスが起動するまで待ってくれるわけではない。その為か、Nginxのコンテナ起動時にFluentdがavailableではないためWARNINGが表示される。これは、FluentdとElasticsearchにも同様のことが言える。Elasticsearchはコンテナ起動からサービスがavailableになるまでの時間が結構かかるのでFluendはすぐに接続することができない。secondsになるとようやく接続できている。リトライの間隔は指数関数的に増えていく(1s,2s,4s,8s,16s)上記の事から、Nginxコンテナ立ち上げ時にFluentdに接続できることは保証されていないので、fluentd-async-connectをtrueにしておく。ドキュメントによるとtrueだと、接続が確立できるまでメッセージをバッファリングしてくれるようである。upしてlocalhostにアクセスすると、NginxのアクセスログがElasticsearchに送信されてKibanaで参照できる。tailでアクセスログを読み込んでいた場合と異なり、containerのログなのでcontainer_idやcontainer_nameも一緒に送られる。このあたりのフォーマットの調整は必要に応じてやればよいだろう。(2)はてなブログをはじめよう!arcrightさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。