web-dev-qa-db-ja.com

Nginx:nginxが監視下で実行されている場合のDockerログコレクターの使用方法

公式のnginx Dockerイメージ( Dockerfile )は、次のトリックを使用してログをstdoutとstderrに渡し、それらがdockerログコレクターによってキャプチャされ、_docker logs <container-name>_を使用して表示できるようにします。

_# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log
RUN ln -sf /dev/stderr /var/log/nginx/error.log
_

同じことをしたいのですが、コンテナにPID 1としてsupervisordがあり、nginxプロセスを監視し、stdoutとstderrをキャプチャして、独自のログファイルです。したがって、ログはDockerログコレクターに到達しません。

これが私のsupervisord.confの関連ブロックです

_[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"
priority=990
; NOTE: We do not want to redirect stdout and stderr of a nginx process to a logfile because we want docker log collector to get them.
stdout_logfile= NOT SURE WHAT TO PUT HERE?
stderr_logfile= NOT SURE WHAT TO PUT HERE?
username=www-data
autorestart=true
_

スーパーバイザドキュメントは素晴らしい( http://supervisord.org/configuration.html )ですが、_stdout_logfile_の場合、必要な答えが得られません。つまり、スーパーバイザをどのように構成するのですか?プロセスstdout/stderrをインターセプトしない(またはログファイルにキャプチャするだけでなく、通常のstdout/stderrにも転送する)。

私がすでに試したこと:

  1. _stdout_logfile=NONE_-stdoutもファイルもログを取得しません
  2. stdout_logfile=/var/log/supervisor/%(program_name)s.log-ログをファイルに取得しますが、標準出力は取得しません。
  3. _stdout_logfile_を定義しない-ランダムに名前が付けられたファイルにログを取得しますが、標準出力は取得しません。
  4. _stdout_logfile=/dev/stdout_-スーパーバイザーがエラーを出します:

    キャプチャされていないCRIT python例外、チャネルを閉じる(stdout)>(:[Errno 29]不正なシーク[/usr/lib/python2.7/dist-packages/supervisor/supervisord.py | runforever | 233] [/usr/lib/python2.7/dist-packages/supervisor/dispatchers.py|handle_read_event|231] [/usr/lib/python2.7/dist-packages/supervisor/dispatchers.py|record_output|165] [/usr/lib/python2.7/dist-packages/supervisor/dispatchers.py|_log|141] [/usr/lib/python2.7/dist-packages/supervisor/loggers.py|info|273] [/ usr/lib/python2.7/dist-packages/supervisor/loggers.py | log | 291] [/usr/lib/python2.7/dist-packages/supervisor/loggers.py|emit|186] [/ usr/lib/python2.7/dist-packages/supervisor/loggers.py | doRollover | 195])

6
Tom

Illegal seekエラーは、ログファイルのローテーションを担当する監視対象のコードによって発生します。ここで説明するように、stdout/stderrにリダイレクトするには、ログファイルのローテーションを無効にする必要があります。

http://veithen.github.io/2015/01/08/supervisord-redirecting-stdout.html

9
Andreas Veithen