当サイトは、アフィリエイト広告を利用しています

uvicornのログをファイル出力する際の文字化け対策

作成日:2025月02月21日
更新日:2025年02月21日

fastapi製のアプリケーションをuvicornで動かす際に
ログをファイル出力すると文字化けしたのでその対応を忘備録として残す

uvicornのログをファイル出力する

uvicornのログをファイル出力するようにカスタマイズする

ymlファイルでuvicornのログ出力を設定する

uvicornのログ設定をymlファイルに記述してコマンド起動時に設定する

logging_config_custom.yml
version: 1
disable_existing_loggers: False
formatters:
default:
"()": "uvicorn.logging.DefaultFormatter"
fmt: "%(levelprefix)s %(message)s"
handlers:
default:
class: logging.StreamHandler
level: INFO
formatter: default
stream: ext://sys.stderr
error_file:
class: logging.FileHandler
level: INFO
formatter: default
filename: /workspace/log/error_logfile
loggers:
uvicorn.error:
handlers: [default, error_file]
level: INFO
propagate: false

これでuvicornを起動し、コンソールとerror_logfileを確認すると

コンソール

2025-02-19-23-00-18

カラーで出力される

error_logfile

error_logfile
INFO: Will watch for changes in these directories: ['/workspace']
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO: Started reloader process [1] using WatchFiles
INFO: Started server process [8]
INFO: Waiting for application startup.
INFO: Application startup complete.

文字化けのようになっている

なぜ文字化けするのか?

これは uvicorn`のログに ANSI エスケープシーケンス(色コード)が含まれているため。
ファイルに記録されるとそのまま出力され、文字化けのようになる。

解決策

logging_config_custom.yml
version: 1
disable_existing_loggers: False
formatters:
default:
"()": "uvicorn.logging.DefaultFormatter"
fmt: "%(levelprefix)s %(message)s"
use_colors: False
handlers:
default:
class: logging.StreamHandler
level: INFO
formatter: default
stream: ext://sys.stderr
error_file:
class: logging.FileHandler
level: INFO
formatter: default
filename: /workspace/log/error_logfile
loggers:
uvicorn.error:
handlers: [default, error_file]
level: INFO
propagate: false

use_colors: Falseを設定すれば、ファイルで文字化けはしなくなる

注意

「use_colors: False」を指定した場合はコンソールも
2025-02-19-22-54-58

のようにカラーではなくなるので、コンソールにはカラーで出したい場合は

logging_config_custom.yml
version: 1
disable_existing_loggers: False
formatters:
default:
"()": "uvicorn.logging.DefaultFormatter"
fmt: "%(levelprefix)s %(message)s"
file:
"()": "uvicorn.logging.DefaultFormatter"
fmt: "%(levelprefix)s %(message)s"
use_colors: False
handlers:
default:
class: logging.StreamHandler
level: INFO
formatter: default
stream: ext://sys.stderr
error_file:
class: logging.FileHandler
level: INFO
formatter: file
filename: /workspace/log/error_logfile
loggers:
uvicorn.error:
handlers: [default, error_file]
level: INFO
propagate: false

のようにformatterを分けて対応する必要がある

uvicornのログカスタマイズについて詳しくは下記記事参照

新着記事

タグ別一覧
top