LoginSignup
0
0

More than 3 years have passed since last update.

解決方法:passenger-dockerでログ出力が止まる

Posted at

困っていたこと

passenger-dockerを利用して構築したコンテナ(Railsアプリ)をAWS ECS上で動かして、CloudWatchでログを収集していたところ、翌々日の6:20~6:50頃にCloudWatchへのログ出力が止まってしまう事象が発生。

ログ出力が止まるタイミングで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でログ出力先を標準出力に設定する。

/etc/nginx/sites-enabled/app.conf

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のコンフィグで環境変数を定義しておく。

/etc/nginx/main.d/env.conf
env RAILS_LOG_TO_STDOUT;

コンテナの実行環境(AWS ECSの場合はタスク定義)で環境変数RAILS_LOG_TO_STDOUTを設定すれば、Railsアプリのログが標準出力されるようになる。


備考

passenger_log_file を server 以下に指定するとエラーになる。

/etc/nginx/sites-enabled/app.conf
# OK
passenger_log_file /dev/stdout;

server {
  # NG
  passenger_log_file /dev/stdout;
}
log
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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0