gunicornのworker-classにuvicornを指定するときに、uvicornのlog-configを指定したい
こんにちは。
ECシステム開発チームのいまづです。
uvicornの設定情報をどうやって渡すのかでちょっと困った話です。
gunicornじゃなくて、uvicornの log-config を指定したいんだが
ちょっとしたAPIサーバーをFastAPIを使って書いてみているのですが、デプロイするのにDockerfileとかを書き出したら、ログ出力が思ったようにできていなくて困りました。
uvicornで動かすと、loggingを使ったログ出力が出ないよーという話は検索すると色々出てくるので、それらを参考にログの設定ファイルを書いて uvicorn ... --log-config uvicorn-log-config.yaml
などしてログが出力されるようにはなったけど、じゃあgunicornのworkerとしてuvicornを指定したいときはどうするんだ、となるとドキュメントにも書かれていない様子(見つけられていないだけ?)。
gunicornの--log-config
を指定しても、それはgunicornの設定であってworker-class側の指定じゃないですしね。
設定じゃなくて自前のクラスで指定する
https://github.com/encode/uvicorn/blob/7d274ed3894b8e16fcbdc69a6456f8ca12b33711/uvicorn/workers.py#L20
UvicornWorker
クラスを見ると、クラスに指定した CONFIG_KWARGS
の内容で config_kwargs
を上書きしていますね。
workerクラスを定義して、それを指定して実行するようにするしかないのかな。
class MyWorker(UvicornWorker):
CONFIG_KWARGS = {
"log_config": os.getenv('LOG_CONFIG'),
}
(環境変数 LOG_CONFIG
に作成したログの設定ファイル uvicorn-log-config.yaml
のパスを設定しておく前提)
gunicorn docsdb.api_main:app --workers 4 --worker-class myapp.MyWorker --bind 0.0.0.0:8000
これで思ったようにログが出力されるようになりました。:D
システムエンジニア募集中です!
興味のある方はぜひカジュアル面談へ!お待ちしています。