コンテンツにスキップ
gunicornのworker-classにuvicornを指定するときに、uvicornのlog-configを指定したい

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クラスを定義して、それを指定して実行するようにするしかないのかな。

python
class MyWorker(UvicornWorker):
    CONFIG_KWARGS = {
        "log_config": os.getenv('LOG_CONFIG'),
    }

(環境変数 LOG_CONFIG に作成したログの設定ファイル uvicorn-log-config.yaml のパスを設定しておく前提)

shell
gunicorn docsdb.api_main:app --workers 4 --worker-class myapp.MyWorker --bind 0.0.0.0:8000

これで思ったようにログが出力されるようになりました。:D

 

 

 


 

システムエンジニア募集中です!

興味のある方はぜひカジュアル面談へ!お待ちしています。

前の記事 In Case You Missed it, the RA6M5 is a Thing(+)!