この記事について
ログを標準出力しないタイプのアプリケーション(=ログファイルに書き込む)をコンテナで動かす際、ログファイルの内容をdocker logs コマンドやkubectl logs コマンドで出力できるようにする方法についてまとめた記事です。
docker logsやkubectl logsでログを出力できる状態にすることで、AWSであればCloudWatch、GCPであればStackDriver、kubernetesであればfluentd等で、コンテナ内に標準出力されたアプリケーションの実行ログを確認することが可能になります。
具体的には?
phpをコンテナ上で動かすと、アプリケーションの実行ログはphp.ini内で定義したパスに書き込まれます。
php.ini
error_log = /var/log/php/error.log
上記の例では、アプリケーションのログ自体はerror.logに出力できるものの、ログをOSから標準出力
していないので、docker logsやkubectl logsから実行ログを確認することはできません。
どうしたらいいか?
Dockerfileにtailコマンドを記述し、コンテナの実行中は常にログファイルの内容を標準出力できるようにしてあげましょう。
Dockerfile
CMD /bin/tail -f /var/log/php/error.log > /dev/stdout
※他に実行すべきCMDがある場合は"&"で並列で実行してください。
補足
本記事で検証した環境は以下の通りです。
- CentOS 7.x
- Apache 2(httpd)
- PHP7.0
CentOS7.xではなくUbuntu18.xだったり、ApacheではなくNginxでPHPを動かす場合には、他の出力方法があるそうです。
(例えば、php.iniで"error_log = /dev/stdout"と指定したり、error.logと/dev/stdoutにシンボリックリックを貼ってあげたりといったことが考えられます)
以上