次のように、ログを/ dev / stdoutに送信するときに生成されるすべてのログメッセージで、スーパーバイザーがキャプチャされていないCRITをログに記録するという問題がまだ発生しています。
2017-05-17 12:20:27,860 CRIT uncaptured python exception, closing channel <POutputDispatcher at 140178721855392 for <Subprocess at 140178721855248 with name cause-error in state STARTING> (stdout)> (<type 'exceptions.IOError'>:[Errno 29] Illegal seek [/usr/local/lib/python2.7/dist-packages/supervisor/supervisord.py|runforever|227] [/usr/local/lib/python2.7/dist-packages/supervisor/dispatchers.py|handle_read_event|232] [/usr/local/lib/python2.7/dist-packages/supervisor/dispatchers.py|record_output|166] [/usr/local/lib/python2.7/dist-packages/supervisor/dispatchers.py|_log|142] [/usr/local/lib/python2.7/dist-packages/supervisor/loggers.py|info|275] [/usr/local/lib/python2.7/dist-packages/supervisor/loggers.py|log|293] [/usr/local/lib/python2.7/dist-packages/supervisor/loggers.py|emit|186] [/usr/local/lib/python2.7/dist-packages/supervisor/loggers.py|doRollover|211])
これは#638に似ていますが、3.3.1でも存在し、スタックトレースが異なります。
再現性のある問題を引き起こす最小限のDockerfileを作成しました: https ://gist.github.com/madmuffin1/33408001a402c2fd98bc0b227185b363
さらに詳しい情報が必要な場合は、お知らせください。喜んでサポートさせていただきます。
ドキュメントをさらに調べたところ、 redirect_stdout
とredirect_stderr
があり、期待どおりに機能することがわかりました。 したがって、この問題は、より役立つエラーメッセージを生成することでおそらく防ぐことができます。
上記のログメッセージは、ログローテーション中に不正なシークエラーが発生したことを示しています。
設定ファイルは次のとおりです。
apt-get update && apt-get install -y -q locales python-pip && pip install Supervisor && \を実行します
echo "[supervisord] nnodaemon = truenn [program:cause-error] ncommand = / bin / bash -c'echo Test 'nstdout_logfile = / dev / stdout"> /etc/supervisord.conf
その構成はログローテーションを使用します(デフォルトでオンになっています)が、シークできないログファイルを指定しました:
stdout_logfile=/dev/stdout
本当にstdoutを使用したい場合は機能するかもしれませんが、最低限、ログローテーションを無効にする必要があります( stdout_maxbytes=0
(構成)を設定します)。
ドキュメントをさらに調べたところ、redirect_stdoutとredirect_stderrがあり、期待どおりに機能することがわかりました。
redirect_stdout
オプションはなく、 redirect_stderr
はこれに影響しません。 redirect_stderr
オプションを使用すると、 supervisord
はstderr
をstdout
と同じファイルに記録します。 ログファイルをシーク可能なファイルに変更しないか、ローテーションを無効にしない場合でも、エラーが表示されます。
@mnaberezに感謝します!
私のように誰かがこのエラーに遭遇した場合は、上記のオプションが[supervisord]
セクションに適用されることに注意してください。 [program:x]
セクション内では、 stdout_logfile_maxbytes = 0
および/またはstderr_logfile_maxbytes = 0
を使用する必要があります。それぞれ
私はこのようなことをしました:
stdout_logfile = / dev / stdout
stderr_logfile = / dev / stderr
stdout_maxbytes = 0
stderr_maxbytes = 0
stdout_logfile_maxbytes = 0
stderr_logfile_maxbytes = 0
最も参考になるコメント
@mnaberezに感謝します!
私のように誰かがこのエラーに遭遇した場合は、上記のオプションが
[supervisord]
セクションに適用されることに注意してください。[program:x]
セクション内では、stdout_logfile_maxbytes = 0
および/またはstderr_logfile_maxbytes = 0
を使用する必要があります。それぞれ