Hi takezawa_skk,
アプリサービス(Windowsコンテナ)は、デフォルトでは日本語のような非ラテン文字に対してコンソールでUnicode出力を正しく解釈しません。それらをエスケープします(例:これ)なぜなら、基になるPowerShellまたはCMDプロセスのエンコーディングが非Unicodeコードページ(437または1252など)にデフォルト設定されているからです。また、Azureポータル上のアプリサービスコンソールログビューアは、基になるWindowsプロセスから書き込まれたログをそのまま表示するため、デフォルトではUTF-8をうまく処理しません。
この状況での最善の回避策は、Pythonロガーにエスケープされた文字列ではなくデコードされたユニコードを出力させることです。次のようにすることができます:
StreamHandlerを更新して、UTF-8を明示的に扱うOutputStreamを使用します。app.pyを次のように修正してください:
import sys
import logging
from logging import StreamHandler
from flask import Flask
app = Flask(__name__)
# Ensure UTF-8 output
stream_handler = StreamHandler(sys.stdout)
stream_handler.setFormatter(logging.Formatter('%(message)s'))
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
logger.addHandler(stream_handler)
@app.route("/")
def hello():
logger.info("これはテストです")
logger.info("This is test.")
return "Hello, Flask"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)
これは日本語のテキストをそのまま出力し、エスケープしません。
コンテナが mcr.microsoft.com/windows/servercore:ltsc2022
を使用している場合でも、システムロケールが UTF-8 と互換性があることを確認してください。Dockerfile
に次を追加します:
# Set system locale to Japanese + UTF-8
RUN powershell -Command "Set-WinSystemLocale ja-JP"
RUN setx PYTHONIOENCODING utf-8
注: setx
はコンテナセッション内で環境変数を永続化します。
また、アプリを実行する前にコンテナ内でコードページを強制してみてください:
CMD chcp 65001 && python app.py
chcp 65001
はコードページをUTF-8に切り替えます。
AppServiceConsoleLogs
が日本語をエスケープし続ける場合は、ログをファイルに書き込むか、UTF-8をサポートし、日本語コンテンツを適切に扱うApplication InsightsやAzure Monitorに送信することを検討してください。より良い可視性のために、OpenCensusを介してFlaskとApplication Insightsを統合できます。
https://learn.microsoft.com/ja-jp/azure/app-service/troubleshoot-diagnostic-logs
https://docs.python.org/3/howto/unicode.html#unicode-in-python-3
https://learn.microsoft.com/ja-jp/powershell/module/international/set-winsystemlocale?view=windowsserver2025-ps
https://learn.microsoft.com/ja-jp/previous-versions/azure/azure-monitor/app/opencensus-python
回答が役に立った場合は、「回答を受け入れる」をクリックし、他の同様の問題に直面している人々が恩恵を受けられるように、ぜひアップボートしてください。
他にご質問があればお知らせください。