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

【FastApi 】uvicornのログ設定をカスタマイズする方法.

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

fastapi製のアプリケーションを動かす際によく使われる
ASGI(Synchronous Server Gateway Interface)サーバのUvicornで
ログの出力をカスタマイズする方法を調べたので忘備録として残す。

Uvicornのロガーについて

uvicornは内部でPython標準のloggingモジュールのdictConfigを使って
デフォルトでロガーが設定されている

Uvicorn内部のdictConfig(デフォルトのロガー設定)

uvicorn.config.LOGGING_CONFIG
LOGGING_CONFIG: dict[str, Any] = {
# ロギングの設定バージョン (固定で 1 を指定)
"version": 1,
# 既存のロガーを無効にしない (他のロガー設定を保持する)
"disable_existing_loggers": False,
# 【フォーマッターの設定】ログの出力フォーマットを定義
"formatters": {
# デフォルトのフォーマット (主に uvicorn.error で使用)
"default": {
"()": "uvicorn.logging.DefaultFormatter",
"fmt": "%(levelprefix)s %(message)s", # ログレベルとメッセージのみ出力
"use_colors": False, # ANSI カラー出力 (ターミナルによって自動調整)
},
# アクセスログのフォーマット (HTTP リクエスト情報を含む)
"access": {
"()": "uvicorn.logging.AccessFormatter",
"fmt": '%(levelprefix)s %(client_addr)s - "%(request_line)s" %(status_code)s', # クライアントIP、リクエスト、ステータスコードを表示
},
},
# 【ハンドラーの設定】ログの出力先を定義
"handlers": {
# 標準ログの出力先 (uvicorn.error など)
"default": {
"formatter": "default", # 上記の "default" フォーマッターを使用
"class": "logging.StreamHandler", # 標準出力に送るストリームハンドラー
"stream": "ext://sys.stderr", # 出力先を標準エラー (stderr) に指定
},
# アクセスログの出力先 (uvicorn.access 用)
"access": {
"formatter": "access", # 上記の "access" フォーマッターを使用
"class": "logging.StreamHandler", # 標準出力に送るストリームハンドラー
"stream": "ext://sys.stdout", # 出力先を標準出力 (stdout) に指定
},
},
# 【ロガーの設定】各ロガーが使用するハンドラーとログレベルを定義
"loggers": {
# メインの Uvicorn ロガー (デフォルトでは出力されない)
"uvicorn": {
"handlers": ["default"], # 標準ログのハンドラーを使用
"level": "INFO", # INFO レベル以上を出力
"propagate": False, # 他のロガーにログを伝播させない
},
# エラーログ (起動メッセージや例外ログを出力)
"uvicorn.error": {
"level": "INFO", # INFO レベル以上を出力 (ハンドラーは root logger に委任)
},
# アクセスログ (HTTP リクエストログを出力)
"uvicorn.access": {
"handlers": ["access"], # アクセスログ専用のハンドラーを使用
"level": "INFO", # INFO レベル以上を出力
"propagate": False, # 他のロガーにログを伝播させない
},
},
}

「formatters」、「handlers」、「loggers」などの項目については下記記事で詳しくまとめている

上記の通り、uvicornはデフォルトでは

  • uvicorn
  • uvicorn.error
  • uvicorn.access

3つのロガーが設定してある

uvicornロガー

汎用的に使用されるロガー。 設定はしてあるが、、Uvicorn のコード内部で logging.getLogger("uvicorn") に対してログが送られていないため、何も出力されない。
つまり、デフォルトでは 「uvicorn ロガーは設定されているけど、何も出力しない」 という状態になっている。

uvicornロガーを有効にするには、明示的に

uvicorn
logging.getLogger("uvicorn")

をして使う必要がある

uvicorn.errorロガー

サーバー起動メッセージや例外に使用されるロガー。

uvicorn_error
# エラーログ (起動メッセージや例外ログを出力)
"uvicorn.error": {
"level": "INFO", # INFO レベル以上を出力 (ハンドラーは root logger に委任)
},

のようにログレベルしか明示されていないので

  • 出力先
  • フォーマット

はルートロガーを設定を継承する

つまり、ログレベルINFO以上のログがsys.stderr(標準エラー出力)に下記のフォーマットで出力される

フォーマット
%(asctime)s - %(name)s - %(levelname)s - %(message)s

uvicorn起動時にログ出力されている

起動時ログ
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.errorロガーが出している

uvicorn.accessロガー

HTTPリクエストのアクセスを記録するログ。
ログレベルINFO以上のログがsys.stdout(標準出力)に下記のフォーマットで出力される

フォーマット
%(levelprefix)s %(client_addr)s - "%(request_line)s" %(status_code)s

REST APIのエンドポイントにアクセスした時に出力される

アクセスログ
INFO: 172.28.0.1:50100 - "GET / HTTP/1.1" 211

はuvicorn.accessロガーが出している

Uvicornのデフォルトロガーの動作

特に何も設定せずにUvicornを動かしたとしても基本的なログは
uvicorn.errorロガーとuvicorn.errorロガーがコンソールに出力してくれる

Uvicornのログ設定をカスタマイズする方法

Uvicornに対してデフォルトではなく、ログ出力をカスタマイズしたい場合、方法としては

  • Pythonスクリプトでuvicorn.run()実行時にdictで設定する
  • コマンド実行時に --log-config オプションでyamlファイルで設定する

の2つがある

Pythonスクリプトでuvicorn.run()実行時にdictで設定する

Pythonスクリプトからuvicornを起動する場合は
uvicorn.runメソッドの引数「log_config」にuvicorn設定辞書を渡すことで
カスタマイズをすることができる

runメソッド
uvicorn.run(
"asgi:app",
host=config["host"],
port=config["port"],
reload=config["reload"],
# log_level=config["log_level"],
access_log=True,
log_config=custom_logging_config
)
  • 引数log_configにdictを渡すことでUvicornのログ設定をカスタマイズできる。

簡単なfastapiのREST APIを上記の方法でログ設定をカスタマイズした
uvicornで動作させて確認する

カスタマイズ内容

カスタマイズは下記にする

uvicornロガー(汎用ロガー)

  • デフォルト :出力なし ↓
  • カスタマイズ①:エンドポイントにアクセスがあった場合に標準出力に任意のログを出力するように設定
  • カスタマイズ②:ログレベルがCRITICAL以上の場合はファイルにも出力するように設定

uvicorn.errorロガー(エラーロガー)

  • デフォルト :標準出力だけに起動やエラーログを出力する ↓
  • カスタマイズ①:エラーログファイルにも出力するように設定

uvicorn.accessロガー(アクセスロガー)

  • デフォルト :標準出力だけにアクセスログを出力する ↓
  • カスタマイズ①:アクセスログファイルにも出力するように設定

fastapiのREST APIのプロジェクト構成

プロジェクト構成
.
|-- app
| |-- __init__.py
| |-- asgi.py
| |-- endpoints.py
| `-- main.py
|-- docker-compose.yml
|-- dockerfile
|-- requirements.txt
|-- start_uvicorn.py
`-- uvicorn_config.py

dockerコンテナ上でfastapiのREST APIをuvicornで動かす

dockerfile

dockerfile
FROM python:3.12
# PYTHONPATHの設定
ENV PYTHONPATH=/workspace/app
# workspaceディレクトリ作成、移動
WORKDIR /workspace
# プロジェクトディレクトリにコピー
COPY requirements.txt /workspace
# 必要パッケージのインストール
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
  • requirements.txtのパッケージをインストールしてdockerイメージを作る

requirements.txt

requirements.txt
fastapi==0.115.6
uvicorn[standard]==0.34.0
  • REST APIに必要なパッケージ

docker-compose.yml

docker-compose.yml
version: "3"
services:
uvicorn-log:
container_name: "uvicorn-log"
build:
context: .
dockerfile: Dockerfile
volumes:
- .:/workspace
tty: true
ports:
- 8000:8000
entrypoint: ["python", "start_uvicorn.py"]
  • dockerfileで作ったイメージからコンテナを作る
  • コンテナ起動時にstart_uvicorn.pyを実行する

app/main.py

main.py
from fastapi import FastAPI
import logging
import endpoints as endpoints
# from logger import logger_init
def create_app():
# アプリケーションインスタンスの作成
app = FastAPI()
# ルーティング設定
app.include_router(endpoints.router)
return app
  • アプリケーションの初期化処理を行うモジュール

app/asgi.py

asgi.py
from main import create_app
app = create_app()
  • FastApiアプリケーションをASGIサーバーで起動するための エントリーポイントとなるモジュール

app/endpoints.py

endpoints.py
import logging
from fastapi import APIRouter, HTTPException
from fastapi.responses import JSONResponse
# uvicornロガーを取得
logger = logging.getLogger("uvicorn")
router = APIRouter()
# ディクショナリ
users = [
{"user_id": "1", "name": "Tujimura", "age": 11},
{"user_id": "2", "name": "mori", "age": 20},
{"user_id": "3", "name": "shimada", "age": 501},
{"user_id": "4", "name": "kyogoku", "age": 70}
]
# ユーザー一覧を取得
@router.get("/")
async def get_users():
# ログ出力
logger.error("error")
logger.critical("critical")
return JSONResponse(status_code=211, content=users)
  • エンドポイントを管理するモジュール
  • uviconrロガーを取得
  • ログをログレベル「error」と「critical」でそれぞれ出力

uvicorn_config.py

uvicorn_config.py
import os
# ログディレクトリの作成
log_dir = "/workspace/log"
os.makedirs(log_dir, exist_ok=True)
# uvicornログ設定
custom_logging_config = {
# ロギングの設定バージョン (固定で 1 を指定)
"version": 1,
# 既存のロガーを無効にしない (他のロガー設定を保持する)
"disable_existing_loggers": False,
# 【フォーマッターの設定】ログの出力フォーマットを定義
"formatters": {
# デフォルトのフォーマット (主に uvicorn.error で使用)
"default": {
"()": "uvicorn.logging.DefaultFormatter",
"fmt": "%(levelprefix)s %(message)s", # ログレベルとメッセージのみ出力
"use_colors": False, # ANSI カラー出力 (ターミナルによって自動調整)
},
# アクセスログのフォーマット (HTTP リクエスト情報を含む)
"access": {
"()": "uvicorn.logging.AccessFormatter",
"fmt": '%(levelprefix)s %(client_addr)s - "%(request_line)s" %(status_code)s', # クライアントIP、リクエスト、ステータスコードを表示
"use_colors": False, # ANSI カラー出力 (ターミナルによって自動調整)
},
},
# 【ハンドラーの設定】ログの出力先を定義
"handlers": {
# 標準ログの出力先
"default": {
"formatter": "default", # 上記の "default" フォーマッターを使用
"level": "INFO",
"class": "logging.StreamHandler", # 標準出力に送るストリームハンドラー
"stream": "ext://sys.stderr", # 出力先を標準エラー (stderr) に指定
},
# クリティカルログファイル出力
"critical_file": {
"formatter": "default",
"level": "CRITICAL",
"class": "logging.FileHandler",
"filename": os.path.join(log_dir, "critical_logfile"),
},
# エラーログファイル出力
"error_file": {
"formatter": "default",
"level": "INFO",
"class": "logging.FileHandler",
"filename": os.path.join(log_dir, "error_logfile"),
},
# アクセスログファイル出力
"access_file": {
"formatter": "access",
"level": "INFO",
"class": "logging.FileHandler",
"filename": os.path.join(log_dir, "access_logfile"),
},
},
# 【ロガーの設定】各ロガーが使用するハンドラーとログレベルを定義
"loggers": {
# メインの Uvicorn ロガー (デフォルトでは出力されない)
"uvicorn": {
"handlers": ["default","critical_file"], # 標準ログのハンドラーを使用
"level": "INFO", # ロガーではINFO レベル以上を出力
"propagate": False, # 他のロガーにログを伝播させない
},
# エラーログ (起動メッセージや例外ログを出力)
"uvicorn.error": {
"handlers": ["default","error_file"], # コンソールとエラーログファイルに出力
"level": "INFO", # ロガーではINFO レベル以上を出力
"propagate": False, # 他のロガーにログを伝播させない
},
# アクセスログロガー
"uvicorn.access": {
"handlers": ["default","access_file"], # コンソールとアクセスログファイルに出力
"level": "INFO", # ロガーではINFO レベル以上を出力
"propagate": False, # 他のロガーにログを伝播させない
},
},
}
# uvicorn起動
config = {
"host": "0.0.0.0",
"port": 8000,
"reload": True,
"log_level": "info",
"log_config": custom_logging_config,
}
  • ログの設定は辞書「custom_logging_config」にまとめる
  • ログ設定を含めたuvicornの設定を辞書「config」にまとめる。

start_uvicorn.py

start_uvicorn.py
import uvicorn
from uvicorn_config import config # uvicornの設定
if __name__ == "__main__":
# uvicorn起動
uvicorn.run(
"asgi:app",
host=config["host"],
port=config["port"],
reload=config["reload"],
access_log=True,
log_config=config["log_config"] # uviconrのlog設定
)
  • uvicorn_config.pyの「config」の値をuvicorn.runの引数に設定してuvicornを起動する

uvicornログ確認

カスタマイズしたロガー

  • uvicornロガー(汎用ロガー)
  • uvicorn.errorロガー(エラーロガー)
  • uvicorn.accessロガー(アクセスロガー)

の動作を確認する。

uvicornロガー(汎用ロガー)の確認

uvicornロガーの設定は

uvicornロガー
"uvicorn": {
"handlers": ["default","critical_file"], # 標準ログのハンドラーを使用
"level": "INFO", # ロガーではINFO レベル以上を出力
"propagate": False, # 他のロガーにログを伝播させない
},

で、ログレベルが「INFO」以上なっている
そして、ハンドラーに

ハンドラー
"handlers": {
# 標準ログの出力先
"default": {
"formatter": "default", # 上記の "default" フォーマッターを使用
"level": "INFO",
"class": "logging.StreamHandler", # 標準出力に送るストリームハンドラー
"stream": "ext://sys.stderr", # 出力先を標準エラー (stderr) に指定
},
# クリティカルログファイル出力
"critical_file": {
"formatter": "default",
"level": "CRITICAL",
"class": "logging.FileHandler",
"filename": os.path.join(log_dir, "critical_logfile"),
},

"default"と"critical_file"が設定されている

まとめるとuvicornロガーのログ出力は

  • ログレベル「INFO」以上を標準エラーに出力
  • ログレベル「CRITICAL」以上をcritical_logfileに出力

となる。

uvicornロガーで出力しているのは

endpoints.py
import logging
from fastapi import APIRouter, HTTPException
from fastapi.responses import JSONResponse
# uvicornロガーを取得
logger = logging.getLogger("uvicorn")
router = APIRouter()
# ディクショナリ
users = [
{"user_id": "1", "name": "Tujimura", "age": 11},
{"user_id": "2", "name": "mori", "age": 20},
{"user_id": "3", "name": "shimada", "age": 501},
{"user_id": "4", "name": "kyogoku", "age": 70}
]
# ユーザー一覧を取得
@router.get("/")
async def get_users():
# ログ出力
logger.error("error")
logger.critical("critical")
return JSONResponse(status_code=211, content=users)

の部分になる

下記のようにREST APIのGETリクエストを実行して

ターミナル
$ curl -i -X GET http://localhost:8000
HTTP/1.1 211
date: Fri, 14 Feb 2025 13:20:22 GMT
server: uvicorn
content-length: 168
content-type: application/json
[{"user_id":"1","name":"Tujimura","age":11},{"user_id":"2","name":"mori","age":20},{"user_id":"3","name":"shimada","age":501},{"user_id":"4","name":"kyogoku","age":70}]

コンテナのログを確認すると

コンテナログ
$ docker logs uvicorn-log
INFO: Will watch for changes in these directories: ['/workspace'] # uvicorn.errorロガーのログ
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) # uvicorn.errorロガーのログ
INFO: Started reloader process [1] using WatchFiles # uvicorn.errorロガーのログ
INFO: Started server process [8] # uvicorn.errorロガーのログ
INFO: Waiting for application startup. # uvicorn.errorロガーのログ
INFO: Application startup complete. # uvicorn.errorロガーのログ
ERROR: error
CRITICAL: critical
INFO: 172.18.0.1:32804 - "GET / HTTP/1.1" 211 # uvicorn.accessロガーのログ

のようにuvicornロガーのログが出力されている
※他のロガーのログも混在している

critical_logfileには

log
CRITICAL: critical

のようにログレベルが「critical」のログのみが記録される

uvicorn.errorロガー(エラーロガー)

uvicorn.errorロガーの設定は

uvicorn.errorロガー
# エラーログ (起動メッセージや例外ログを出力)
"uvicorn.error": {
"handlers": ["default","error_file"], # コンソールとエラーログファイルに出力
"level": "INFO", # ロガーではINFO レベル以上を出力
"propagate": False, # 他のロガーにログを伝播させない
},

で、ログレベルが「INFO」以上なっている
そして、ハンドラーに

ハンドラー
# 【ハンドラーの設定】ログの出力先を定義
"handlers": {
# 標準ログの出力先
"default": {
"formatter": "default", # 上記の "default" フォーマッターを使用
"level": "INFO",
"class": "logging.StreamHandler", # 標準出力に送るストリームハンドラー
"stream": "ext://sys.stderr", # 出力先を標準エラー (stderr) に指定
},
# # クリティカルログファイル出力
# "critical_file": {
# "formatter": "default",
# "level": "CRITICAL",
# "class": "logging.FileHandler",
# "filename": os.path.join(log_dir, "critical_logfile"),
},
# エラーログファイル出力
"error_file": {
"formatter": "default",
"level": "INFO",
"class": "logging.FileHandler",
"filename": os.path.join(log_dir, "error_logfile"),
},

"default"と"error_file"が設定されているので

まとめるとuvicorn.errorロガーのログ出力は

  • ログレベル「INFO」以上を標準エラーに出力
  • ログレベル「INFO」以上をerror_logfileに出力

となる。

uvicorn.errorロガーはサーバー起動時や例外時に出力されるように
デフォルトで設定されているので特にREST APIのプログラム上ではロガーを取得しない。

コンテナ起動時のログを見ると

コンテナログ
$ docker logs uvicorn-log
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.
ERROR: error # uvicornロガーのログ
CRITICAL: critical # uvicornロガーのログ
INFO: 172.18.0.1:32804 - "GET / HTTP/1.1" 211 # uvicorn.accessロガーのログ

uvicorn.errorロガーのログが出力されている
※他のロガーのログも混在している

同様の内容が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.accessロガー(アクセスロガー)

uvicorn.accessロガーの設定は

uvicorn.errorロガー
# アクセスログロガー
"uvicorn.access": {
"handlers": ["default","access_file"], # コンソールとアクセスログファイルに出力
"level": "INFO", # ロガーではINFO レベル以上を出力
"propagate": False, # 他のロガーにログを伝播させない
},

で、ログレベルが「INFO」以上なっている
そして、ハンドラーに

ハンドラー
"handlers": {
# 標準ログの出力先
"default": {
"formatter": "default", # 上記の "default" フォーマッターを使用
"level": "INFO",
"class": "logging.StreamHandler", # 標準出力に送るストリームハンドラー
"stream": "ext://sys.stderr", # 出力先を標準エラー (stderr) に指定
},
# # クリティカルログファイル出力
# "critical_file": {
# "formatter": "default",
# "level": "CRITICAL",
# "class": "logging.FileHandler",
# "filename": os.path.join(log_dir, "critical_logfile"),
# },
# # エラーログファイル出力
# "error_file": {
# "formatter": "default",
# "level": "INFO",
# "class": "logging.FileHandler",
# "filename": os.path.join(log_dir, "error_logfile"),
# },
# アクセスログファイル出力
"access_file": {
"formatter": "access",
"level": "INFO",
"class": "logging.FileHandler",
"filename": os.path.join(log_dir, "access_logfile"),
},

"default"と"access_file"が設定されている

まとめるとuvicorn.accessロガーのログ出力は

  • ログレベル「INFO」以上を標準エラーに出力
  • ログレベル「INFO」以上をaccess_logfileに出力

となる。

uvicorn.accessロガーはアクセス時に出力されるように
デフォルトで設定されているので特にREST APIのプログラム上ではロガーを取得しない。

コンテナ起動時→GETリクエストのログを見ると

コンテナログ
$ docker logs uvicorn-log
INFO: Will watch for changes in these directories: ['/workspace'] # uvicorn.errorロガーのログ
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) # uvicorn.errorロガーのログ
INFO: Started reloader process [1] using WatchFiles # uvicorn.errorロガーのログ
INFO: Started server process [8] # uvicorn.errorロガーのログ
INFO: Waiting for application startup. # uvicorn.errorロガーのログ
INFO: Application startup complete. # uvicorn.errorロガーのログ
ERROR: error # uvicornロガーのログ
CRITICAL: critical # uvicornロガーのログ
INFO: 172.18.0.1:32804 - "GET / HTTP/1.1" 211

uvicorn.accessロガーのログが出力されている ※他のロガーのログも混在している

同様の内容がaccess_logfileにも出力されている

access_logfile
INFO: 172.18.0.1:32804 - "GET / HTTP/1.1" 211

dictConfigでログ設定を行う場合の注意

dictConfigを使ってuvicornのログ設定をする際に
ハマったポイントがあったのでまとめておく。

dictConfigを使ってuvicornのログ設定をする時は
ロガーのログレベルを設定する箇所が

uvicorn_config.py

uvicorn_config.py
"uvicorn": {
"handlers": ["default","critical_file"], # 標準ログのハンドラーを使用
"level": "INFO", # ロガーではINFO レベル以上を出力
"propagate": False, # 他のロガーにログを伝播させない
},

start_uvicorn.py

py
import uvicorn
from uvicorn_config import config
if __name__ == "__main__":
# uvicorn起動
uvicorn.run(
"asgi:app",
host=config["host"],
port=config["port"],
reload=config["reload"],
log_level=config["log_level"],
access_log=True,
log_config=config["log_config"]
)

の箇所ある。

上記の二つともに設定をした場合、ロガーのログレベルは
「uvicorn_config.py」のloggerで設定したログレベルは無視され
「start_uvicorn.py」のuvicorn.runの引数「log_level」で設定した
ログレベルが優先される
※ハンドラーは別

コマンド実行時に --log-config オプションでyamlファイルで設定する

上記ではuvicornをpythonスクリプトから起動する際に、uvicorn.runメソッドの
引数としてuvicornのログ設定のdictを渡したが、こちらは
uvicornをコマンド起動する際にログ設定をしたymlファイルを渡す。

ymlファイルの作成

uviconrnのログ設定ymlファイルを作成する

logging_config_default.yml

logging_config_default.yml
version: 1
disable_existing_loggers: False
formatters:
default:
"()": "uvicorn.logging.DefaultFormatter"
fmt: "%(levelprefix)s %(message)s"
use_colors: False
access:
"()": "uvicorn.logging.AccessFormatter"
fmt: '%(levelprefix)s %(client_addr)s - "%(request_line)s" %(status_code)s'
handlers:
default:
formatter: "default"
class: "logging.StreamHandler"
stream: "ext://sys.stderr"
access:
formatter: "access"
class: "logging.StreamHandler"
stream: "ext://sys.stdout"
loggers:
uvicorn:
handlers: ["default"]
level: "INFO"
propagate: False
uvicorn.error:
level: "INFO"
uvicorn.access:
handlers: ["access"]
level: "INFO"
propagate: False

Uvicorn内部のdictConfig(デフォルトのロガー設定)をyamlファイル化したものを載せておく。
これはデフォルトの設定なので、カスタマイズしたいときをこれに対して行う。

logging_config_custom.yml

logging_config_custom.yml
version: 1
disable_existing_loggers: False
formatters:
default:
"()": "uvicorn.logging.DefaultFormatter"
fmt: "%(levelprefix)s %(message)s"
use_colors: False
access:
"()": "uvicorn.logging.AccessFormatter"
fmt: '%(levelprefix)s %(client_addr)s - "%(request_line)s" %(status_code)s'
use_colors: False
handlers:
default:
class: logging.StreamHandler
level: INFO
formatter: default
stream: ext://sys.stderr
critical_file:
class: logging.FileHandler
level: CRITICAL
formatter: default
filename: /workspace/log/critical_logfile
error_file:
class: logging.FileHandler
level: INFO
formatter: default
filename: /workspace/log/error_logfile
access_file:
class: logging.FileHandler
level: INFO
formatter: access
filename: /workspace/log/access_logfile
loggers:
uvicorn:
handlers: [default, critical_file]
level: INFO
propagate: false
uvicorn.error:
handlers: [default, error_file]
level: INFO
propagate: false
uvicorn.access:
handlers: [default, access_file]
level: INFO
propagate: false

デフォルト設定ymlに対して

  • 「Pythonスクリプトでuvicorn.run()実行時にdictで設定する」

でしたのと同様のカスタマイズをしたyamlファイル

docker-composeファイルの編集

pythonスクリプトでのuvicorn起動から、コマンドでの起動に変更する

docker-compose.yml

docker-compose.yml
version: "3"
services:
uvicorn-log:
container_name: "uvicorn-log"
build:
context: .
dockerfile: Dockerfile
volumes:
- .:/workspace
- ./log:/workspace/log # ローカルの log/ をコンテナの /workspace/log にマウント
tty: true
ports:
- 8000:8000 # ホストマシンのポート8000を、docker内のポート8000に接続する
# entrypoint: ["python", "start_uvicorn.py"]
command:
[
"uvicorn",
"asgi:app",
"--reload",
"--host",
"0.0.0.0",
"--port",
"8000",
"--log-config",
"logging_config_custom.yml",
]
  • entrypointでのpythonスクリプト指定での起動からコマンド起動に切り替え
  • --log-configオプションにymlファイルを指定する

まとめ

要点

  • uvicornには内部でエラーを出すロギング機能がある
  • 何もしなくてもデフォルト設定でログはでる
  • ログカスタマイズする場合は下記の二つの方法がある
    • dictconfigで設定
      • uvicornをpythonスクリプト起動時に引数でdictを設定
    • yamlファイルで設定
      • uvicornをコマンド起動時にymlファイルで設定

参考

関連記事

新着記事

目次
タグ別一覧
top