Supervisor: スーパーバイザー3.3.1:CRITでキャプチャされていないPython例外、チャネルを閉じる

作成日 2017年05月17日  ·  4コメント  ·  ソース: Supervisor/supervisor

次のように、ログを/ 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

さらに詳しい情報が必要な場合は、お知らせください。喜んでサポートさせていただきます。

logging

最も参考になるコメント

@mnaberezに感謝します!

私のように誰かがこのエラーに遭遇した場合は、上記のオプションが[supervisord]セクションに適用されることに注意してください。 [program:x]セクション内では、 stdout_logfile_maxbytes = 0および/またはstderr_logfile_maxbytes = 0を使用する必要があります。それぞれ

全てのコメント4件

ドキュメントをさらに調べたところ、 redirect_stdoutredirect_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オプションを使用すると、 supervisordstderrstdoutと同じファイルに記録します。 ログファイルをシーク可能なファイルに変更しないか、ローテーションを無効にしない場合でも、エラーが表示されます。

@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

このページは役に立ちましたか?
0 / 5 - 0 評価