Python3とuWSGIでstdoutをログに記録する 質問する

Python3とuWSGIでstdoutをログに記録する 質問する

私は uWSGI の背後で Python 2 Flask アプリを実行しており、これは supervisord によって管理されています。ログは Flask アプリによって sys.stdout に書き込まれます。これらのログは uWSGI によって取得され、supervisord によってファイルに書き込まれます。uWSGI ログは /dev/stderr に書き込まれます。以下の supervisord conf を参照してください。

[program:uwsgi]
command = uwsgi --ini /etc/uwsgi.conf --master
directory = /app
autostart = true
autorestart = true
stdout_logfile = /var/log/myapplication/application.log
stdout_logfile_maxbytes = 50000000
stdout_logfile_backups = 3
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes = 0
stopsignal = INT

これはうまく機能します。アプリケーション ログと uWSGI ログをうまく分離できました。

私は現在、Python 3 にアップグレードしました。アプリケーション ログが uWSGI の stderr に出力され、uWSGI ログと混ざってしまうことを除いて、すべて正常に動作しています。

uWSGI ドックを調べてみましたが、Python 2 と Python 3 の間でこの変更が起こる理由を見つけることができませんでした。

ここで提案されているように、ソケットを定義するときにリダイレクトを試みましたhttp://lists.unbit.it/pipermail/uwsgi/2016-February/008383.htmlしかし、それはすべて(アプリケーションと uWSGI ログ)を にリダイレクトするだけです/dev/null

これも見つけたhttp://lists.unbit.it/pipermail/uwsgi/2016-January/008353.htmlしかし、pyimport-shared については何も見つかりませんでした。

何が起こっているのか知っている人はいますか?

役に立つなら、私の uWSGI 設定はここにあります。

[uwsgi]
uid = www-data
gid = www-data
module = application:application

socket = /run/uwsgi.sock

single-interpreter = true
enable-threads = true
buffer-size = 16384

processes = 4

ありがとう

ベストアンサー1

4つのプロセスを実行しているので、uWsgiを--masterフラグ付きで実行していると思います。この場合、フラグを使用してログインプロセスをマスタープロセスに委任することをお勧めします。

--logマスター

どういうわけか、これで問題は解決しました。

から出典: uwsgi.c#L794

{"log-master", no_argument, 0, "マスタープロセスにログを委任する", uwsgi_opt_true, &uwsgi.log_master, UWSGI_OPT_MASTER|UWSGI_OPT_LOG_MASTER},

別のオプション:

から参考:

stdout と stderr を分割する必要がある場合は、起動時に実行される Python コードを使用して、ファイル記述子を再マップするだけです。これら (fd: 1 と 2) は同じリソースを指しますが、supervisord を強制して分割する必要がある場合、唯一の解決策は、関連するファイルを閉じて再度開くことです。

Unix ファイル記述子を使用する代わりに Python ロギング サブシステムを使用する場合は、'python' ロガーも使用できることを考慮してください。

または、スタックから supervisord を削除することもできます :)

おすすめ記事