当サイトは、アフィリエイト広告を利用しています
fastapi製のアプリケーションをuvicornで動かす際に
ログをファイル出力すると文字化けしたのでその対応を忘備録として残す
uvicornのログをファイル出力するようにカスタマイズする
uvicornのログ設定をymlファイルに記述してコマンド起動時に設定する
version: 1disable_existing_loggers: Falseformatters:default:"()": "uvicorn.logging.DefaultFormatter"fmt: "%(levelprefix)s %(message)s"handlers:default:class: logging.StreamHandlerlevel: INFOformatter: defaultstream: ext://sys.stderrerror_file:class: logging.FileHandlerlevel: INFOformatter: defaultfilename: /workspace/log/error_logfileloggers:uvicorn.error:handlers: [default, error_file]level: INFOpropagate: false
これでuvicornを起動し、コンソールとerror_logfileを確認すると
カラーで出力される
[32mINFO[0m: Will watch for changes in these directories: ['/workspace'][32mINFO[0m: Uvicorn running on [1mhttp://0.0.0.0:8000[0m (Press CTRL+C to quit)[32mINFO[0m: Started reloader process [[36m[1m1[0m] using [36m[1mWatchFiles[0m[32mINFO[0m: Started server process [[36m8[0m][32mINFO[0m: Waiting for application startup.[32mINFO[0m: Application startup complete.
文字化けのようになっている
これは uvicorn`のログに ANSI エスケープシーケンス(色コード)が含まれているため。
ファイルに記録されるとそのまま出力され、文字化けのようになる。
version: 1disable_existing_loggers: Falseformatters:default:"()": "uvicorn.logging.DefaultFormatter"fmt: "%(levelprefix)s %(message)s"use_colors: Falsehandlers:default:class: logging.StreamHandlerlevel: INFOformatter: defaultstream: ext://sys.stderrerror_file:class: logging.FileHandlerlevel: INFOformatter: defaultfilename: /workspace/log/error_logfileloggers:uvicorn.error:handlers: [default, error_file]level: INFOpropagate: false
use_colors: Falseを設定すれば、ファイルで文字化けはしなくなる
「use_colors: False」を指定した場合はコンソールも
のようにカラーではなくなるので、コンソールにはカラーで出したい場合は
version: 1disable_existing_loggers: Falseformatters:default:"()": "uvicorn.logging.DefaultFormatter"fmt: "%(levelprefix)s %(message)s"file:"()": "uvicorn.logging.DefaultFormatter"fmt: "%(levelprefix)s %(message)s"use_colors: Falsehandlers:default:class: logging.StreamHandlerlevel: INFOformatter: defaultstream: ext://sys.stderrerror_file:class: logging.FileHandlerlevel: INFOformatter: filefilename: /workspace/log/error_logfileloggers:uvicorn.error:handlers: [default, error_file]level: INFOpropagate: false
のようにformatterを分けて対応する必要がある
uvicornのログカスタマイズについて詳しくは下記記事参照