困っていたこと
passenger-dockerを利用して構築したコンテナ(Railsアプリ)をAWS ECS上で動かして、CloudWatchでログを収集していたところ、翌々日の6:20~6:50頃にCloudWatchへのログ出力が止まってしまう事象が発生。
tail: '/var/log/nginx/error.log' has been replaced; following new file
Feb 10 06:49:48 ip-10-0-4-174 syslog-ng[13]: Configuration reload request received, reloading configuration;
Feb 10 06:49:48 ip-10-0-4-174 syslog-ng[13]: Configuration reload finished;
原因の推測
- CloudWatchではコンテナ内の標準出力をログとして収集している
- ログファイルがローテートされたログが残っている
ことから、「Nginxのログファイルがローテートされたことがトリガーになって、標準出力へのログ出力が止まった」と推測。
解決方法
自分の環境ではCloudWatchでログ収集しており、コンテナ内にログファイルが残る必要はないので、「passengerのログ出力先を標準出力へ切り替える」ことで解決した。
参考資料:
Redirect NGINX and Rails Logs to STDOUT and STDERR · Issue #219 · phusion/passenger-docker
コンフィグ
Nginx
nginxでログ出力先を標準出力に設定する。
passenger_log_file /dev/stdout;
server {
# …
access_log /dev/stdout;
error_log /dev/stdout;
}
補足:Passenger上でRailsアプリを動かしてる場合
Railsでは環境変数RAILS_LOG_TO_STDOUTが存在していればログが標準出力されるようになる。
(値は「ON」「1」など、なんでもOK)
Passengerと連携させるRailsアプリが環境変数RAILS_LOG_TO_STDOUTを利用できるように、Nginxのコンフィグで環境変数を定義しておく。
env RAILS_LOG_TO_STDOUT;
コンテナの実行環境(AWS ECSの場合はタスク定義)で環境変数RAILS_LOG_TO_STDOUTを設定すれば、Railsアプリのログが標準出力されるようになる。
備考
passenger_log_file
を server 以下に指定するとエラーになる。
# OK
passenger_log_file /dev/stdout;
server {
# NG
passenger_log_file /dev/stdout;
}
nginx: [emerg] "passenger_log_file" directive is not allowed here in /etc/nginx/sites-enabled/webapp.conf:25
2019/07/06 00:07:37 [emerg] 28#28: "passenger_log_file" directive is not allowed here in /etc/nginx/sites-enabled/webapp.conf:25