Docker LoggingにFluentdを使いforwardでNginxのログを送信する

過去の記事

実現したいこと

以前、NginxのログをFluentdを用いてElasticsearchに送信する際は、アクセスログをデータボリュームに書き出しtailで読み込んでElasticsearchに送信する方法で実現していた。
その際、オフィシャルのNginxコンテナのアクセスログの仕様について触れた。

  • docker container logsやdocker-compose upをフォアグラウンドで実行していると見ることのできるログに、各コンテナで起きたログを表示するには標準出力、標準エラー出力に内容を書く必要がある。
  • Nginxはアクセスログをログファイルに書きつつ標準出力に書き出す方法がないので、アクセスログを標準出力にシンボリックリンクすることで実現している。
  • そのため/var/log/nginx/access.logにいくらログを書いてもコンテナ内にログは残らなくなっている。
https://chulip.org/entry/2019/08/18/233205

上記仕様を回避するため、ログファイルをわざわざ別名で書き出すようにする必要があった。

しかし、そもそもデフォルトで標準出力にアクセスログが流れてくるのであればそれをそのままElasticsearchに渡してやればよいのでは?
そうすれば、ログファイルに別名を付ける必要もないし、ログを読み込むためだけにデータボリュームを用意する必要もない。

そこで、Docker Loggingを使用してNginxコンテナのログをFluentdに渡してそのままElasticsearchに送信できるようにする。

なお、過去の記事で使用した環境に変更を加えていくのでdiffを記載していく。

Fluentd

参考
--- a/fluentd/fluent.conf
+++ b/fluentd/fluent.conf
@@ -1,9 +1,7 @@
 <source>
-  @type tail
-  format ltsv
-  path /var/log/nginx/myapp_access.log
-  tag nginx
-  pos_file /var/log/nginx/myapp_access.log.pos
+  @type forward
+  port 24224
+  bind 0.0.0.0
 </source>
 
 <match nginx>

typeをforwardに変更。

Nginx

--- a/nginx.conf
+++ b/nginx.conf
@@ -24,8 +24,8 @@ server {
   listen 80;
   server_name localhost;
 
-  access_log /var/log/nginx/myapp_access.log ltsv;
-  error_log  /var/log/nginx/myapp_error.log;
+  access_log /var/log/nginx/access.log ltsv;
+  error_log  /var/log/nginx/error.log;
 
   root /myapp/public;

ログファイルのファイル名を変更して標準出力、標準エラー出力にアクセスログが出力されるように。

docker-compose.yml

参考
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -26,11 +26,16 @@ services:
     volumes:
       - .:/myapp
       - ./nginx.conf:/etc/nginx/conf.d/default.conf
-      - http-log:/var/log/nginx
     ports:
       - 80:80
     depends_on:
       - web
+      - fluentd
+    logging:
+      driver: fluentd
+      options:
+        tag: "nginx"
+        fluentd-async-connect: "true"
   elasticsearch:
     image: elasticsearch:7.3.0
     environment:
@@ -48,7 +53,6 @@ services:
   fluentd:
     build: ./fluentd
     volumes:
-      - http-log:/var/log/nginx
       - ./fluentd/fluent.conf:/fluentd/etc/fluent.conf
     ports:
       - 24224:24224
@@ -57,4 +61,3 @@ services:
 volumes:
   db-data:
   elastic-data:
-  http-log:

まず、loggingの設定を追加。
次に、ログファイルを参照する必要がなくなったのでログファイル用のデータボリューム関連を削除。

次に、fluentd-async-connect。
docker-compose upを行うと下記WARNINGが表示される。

WARNING: no logs are available with the 'fluentd' log driver

docker-compose.ymlのdepends_onでnginxは依存していることを記述しているが、
ただ単にコンテナの作成順序が保証されるだけで、サービスが起動するまで待ってくれるわけではない。
その為か、Nginxのコンテナ起動時にFluentdがavailableではないためWARNINGが表示される。

これは、FluentdとElasticsearchにも同様のことが言える。
Elasticsearchはコンテナ起動からサービスがavailableになるまでの時間が結構かかるのでFluendはすぐに接続することができない。

#0 Remaining retry: 14. Retry to communicate after 2 second(s).

logにもリトライをしている表示が出ていて、自分の環境だとだいたい16 secondsになるとようやく接続できている。
リトライの間隔は指数関数的に増えていく(1s,2s,4s,8s,16s)

上記の事から、Nginxコンテナ立ち上げ時にFluentdに接続できることは保証されていないので、
fluentd-async-connectをtrueにしておく。
ドキュメントによるとtrueだと、接続が確立できるまでメッセージをバッファリングしてくれるようである。

これで、docker-compose upしてlocalhostにアクセスすると、NginxのアクセスログがElasticsearchに送信されてKibanaで参照できる。
tailでアクセスログを読み込んでいた場合と異なり、containerのログなのでcontainer_idやcontainer_nameも一緒に送られる。
このあたりのフォーマットの調整は必要に応じてやればよいだろう。

AMNESIA V Edition プラチナトロフィー取得 感想/レビュー

PSPで発売された「AMNESIA」を追加要素ありでPSVitaに移植した作品。シリーズ初プレイ。

f:id:arcright:20190909220908j:plain
主人公の名前選択可能。デフォルトの名前なし。ボイスなし。

f:id:arcright:20190916210057j:plain
主人公が精霊オリオン↑と同化してしまい、その際に主人公が記憶を失ってしまう。
オリオンの助けも借りながら記憶を取り戻すために奮闘する。

主人公のボイスが無いノベルゲームっていうのはそう珍しいものではないと思うが、
主人公の台詞がこんなに少ないノベルゲームは記憶にある限りでは初めてだ。

というのも、記憶を失った主人公を助けるためにオリオンが世話を焼いてくれるのだが、
その間ずっとオリオンしか喋らない。主人公の台詞は全くない。
記憶を取り戻すまでの間、延々とオリオンが主人公の気持ちを汲み取って代弁し続ける。

なので、オリオン(男)と男キャラクターの会話をずっと見せられることになる。
記憶が戻るとオリオンがいなくなり、主人公の台詞になるがその時にはもうエンディング直前。
結果として主人公の台詞がほとんどないゲームとなっている。

女の子と男のやり取りがみたかったんだけど?

シナリオ

攻略キャラクター毎に並行世界の話なので、登場キャラクター、場所等は同じだけど関係性が全く違う。
なので、各々のルートでせっかく染み込み始めたキャラがルートが変わる度にリセットされてしまうので勿体ない。

あとは、シナリオ読んでいて自分の中で理解しきれていない部分は下記。

  • トランプのマークにはなにか意味が?
  • 冷夏のアピールをしていたけど結局何故?

見逃していたら申し訳ないが、やたらアピールしていたのにちゃんと伏線回収しなかったなと思う。

面白そうな世界観設定だと思うのだがいまいち消化しきれず、勿体ない作品だった。

AMNESIA V Edition - PS Vita

AMNESIA V Edition - PS Vita

  • アイディアファクトリー
Amazon

食品衛生責任者養成講習会を受けてきた

冗談半分の会話から始まったことだが、現在世は「第3次タピオカブーム」。
タピオカミルクティーを扱う店には行列ができ、各社もタピオカを扱う新商品の開発に力を入れている。

つまり、これビッグウェーブでしょ?と。
ビッグウェーブといえば「乗るしかない」ということで実際タピオカを売るにはどうすれば実現できるのか?簡単に調べてみた。

調べるうちに「食品衛生責任者」を置かなければ営業ができないということがわかり、
それは「食品衛生責任者養成講習会」を受ければなることができるようになる。
そして、受講資格は特に必要ない。ということでじゃあ受けてみようと。そういう流れ。

まあ、タピオカに今から参入するには無いと思うけど、今後何かビッグウェーブが来たときに乗れるように可能性を広げておくのは大事かなと。

食品衛生責任者とは?

食品衛生責任者(しょくひんえいせいせきにんしゃ)とは、食品衛生責任者養成講習を受講した者などで、食品衛生責任者として選任されている者である。食品衛生法に定められた許可営業者は、営業許可施設ごとに食品衛生責任者を選任し保健所に届け出ることになっている

食品衛生責任者 - Wikipedia

簡単に言うと食品を扱う飲食店などに必ず1人は食品衛生責任者を選任して配置する必要がある。

食品衛生責任者になるためには、医師や調理師などの定められた資格を持っている人か、掲題の食品衛生責任者養成講習会を受講する必要がある。

申し込み

管轄は都道府県レベルなので、受講する県によって申込方法が異なる場合があるので事前に確認すること。
自分の場合は電話で確認したところ、保健所で手続きしてくれということだったので保健所を訪問。
受講料を収めて受付票をもらい、当日受付票を持って会場に行けばよかった。

当日

会場で受付票を渡して当日使用するテキストを受け取る。

講習会は計6時間あり午前、午後に3時間ずつ。間にお昼休憩1時間というタイムスケジュール。

各項目ごとに担当の講師の方がいて講師の解説を聞きながらテキストを進めていく。
学校の授業と大差ないので特別気をつけるようなことは無い。

丁度今、食品衛生法は過渡期で改正食品衛生法が2018年6月に可決され2020年6月から施行予定となっており改正後の規則を中心に解説がされた。

基本的にはテキストをベースに過去どういう事例があったかという話が進むが、時事ネタを取り入れて解説してくれる講師の方が1人いてその講師の方の部分は非常に為になった。
例えば、改正食品衛生法はHACCPによる衛生管理の実施が必要になるが、このHACCPによる衛生管理というのは国際的にデファクトスタンダードである。
東京オリンピックの選手村に持ち込まれる食品についてはHACCPの基準を満たしていなければ持ち込みことができないので、日本も間に合わせるべく改正を進める必要があったと。

こういった現在進行系の具体的な話題があると興味が湧いていいね。

最後に、簡単なテスト(全員合格するような)がありテストが終わると晴れて食品衛生責任者になれるようになる。

実際に店舗に掲示するようのプレートも名前入りでもらったけど前述の通り開店の予定があるからとったわけではないので当分はお蔵入り。

オリンピックの話をしてくれた講師の方が、新しい知識を仕入れてくるのでまた実務者講習会で会いましょう。と言っていたのが印象的だった。
新しい情報を仕入れていかないといけない業界なので、最新の話をこういった場で聞けるのであれば非常に為になると思う。
実務者講習会についてはこれも都道府県管轄なので必要無いところもあるが、実施するところは数年ごとに1回、更新のタイミングで参加する必要がある。

まとめ

全く知識のない異業種の知識を得ることができて非常に有意義だった。
参加のハードルが低い資格に関しては他にも受けてみようかな。