私は 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マスター
どういうわけか、これで問題は解決しました。
{"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 を削除することもできます :)