App Service ( Windows Container ) にデプロイしたPythonアプリの標準出力について、日本語が文字化けするので解決したい

takezawa_skk 0 評価のポイント
2025-06-09T05:45:35.3633333+00:00

<質問>

App Service ( Windows Container ) にデプロイしたPythonアプリの標準出力について、日本語が文字化けするので解決する方法はありますか?

<環境>

(App Service)

  • 利用サービス: Web App for Containers
  • OS: Windows
  • アプリフレームワーク: Flask
  • アプリ言語: Python3.12
  • ビルドツール: Docker(イメージ:mcr.microsoft.com/windows/servercore:ltsc2022)
  • ビルド補佐ツール:Azure Container Registry
  • 標準出力、標準エラー出力の参照先:App Service( Azure Portal )/監視/ ログ/ AppServiceConsoleLogs
  • 標準出力、標準エラー出力状況: 正常に出力されている。英語は問題なく出力済み
  • デプロイ状況: 正常(ブラウザで確認済み)
  • 文字化け状況: 日本語がUnicodeエスケープされている(下記例参照)

(例)

logger.info("これはテストです")
↓
INFO:__main__:\u3053\u308c\u306f\u30c6\u30b9\u30c8\u3067\u3059

(デプロイアプリ)

検証のために簡易的なFlaskアプリにしてます

--app.py--

import logging
from logging import StreamHandler

from flask import Flask

app = Flask(__name__)

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
streamHandler = StreamHandler()
app.logger.addHandler(streamHandler)


@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)

<検証したこと>

  • ローカルにて上記Dockerコンテナーを起動させ、Powershell, CMDにて日本語の出力及びPython経由からの日本語出力は正常確認済み
  • 上記アプリをApp Service ( Linux )にデプロイして、標準出力と標準エラー出力について日本語出力できたことは正常確認済み
  • App Serviceの環境変数設定(Portalにて、(設定/ 環境変数))は以下実施済み (Dockerfileにも同じようにENVを実施済み)
  • LANG: en_US.UTF-8とja_JP.UTF-8  →影響なし
  • LOCALE: en_US.UTF-8,とja_JP.UTF-8  →影響なし
  • PYTHONUTF8=1  →日本語が???に変化
  • PYTHONIOENCODING=utf-8 →日本語が???に変化
  • PYTHONIOENCODING=shift_jis, cp932 →アプリが立ち上がらなくなる

<認識していること>

  • App Service(Windows)ではPythonをサポートしていない
  • App Service(Windows)のJapaアプリでも日本語の文字化け防止のために環境変数の設定が必要であった

参照

<解決の推測>

エラーの原因は、App Service(Windows)側でPythonの日本語を認識できないことだと思います。方法として考えているのは、App Service側の環境変数設定か、Azure InsightsをFlask側で操作することです。

  • アプリの内容→きわめてシンプルですので、エラー原因はないと思います
  • Docker→コンテナ内で日本語が正常に出力できてたので、エラー原因ではないと思います
Azure SQL Database
Azure SQL Database
Azure リレーショナル データベース サービス。
76 件の質問
0 件のコメント コメントはありません
{count} 件の投票

2 件の回答

並べ替え方法: 最も役に立つ
  1. Bhargavi Naragani 5,270 評価のポイント Microsoft 外部スタッフ モデレーター
    2025-06-09T10:13:37.1733333+00:00

    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

    回答が役に立った場合は、「回答を受け入れる」をクリックし、他の同様の問題に直面している人々が恩恵を受けられるように、ぜひアップボートしてください。

    他にご質問があればお知らせください。


  2. ma_kawa 0 評価のポイント
    2025-06-13T08:56:05.7833333+00:00

    Microsoft サポートご担当者様

    お世話になっております。ma_kawaです。

    takezawa_skk様のログ文字化けに関する議論を拝見しました。takezawa_skk様と同じようにPythonでApp Serviceを開発しており、 大変参考になります。

    私たちは、RFIDリーダーから読み取ったデータをWebページで表示するシステムを検討しており、その際のデータ連携アーキテクチャと、同様に日本語が文字化けしないための構成についてご相談したくコメントいたしました。

    【構成の背景】

    リーダーを制御するPCにはLANポートが一つしかないことを想定しており、PCがインターネット(Azure)とローカルのRFIDリーダーの両方と通信できるよう、スイッチングハブを介したネットワーク構成を考えております。AIアシスタントに相談したところ実現は可能とのことでしたが、Azureの専門家のご意見を伺いたく質問させていただきました。

    【想定しているアーキテクチャ】

    ・ローカル環境:

     1.ネットワーク: インターネットルーター → スイッチングハブ → PCおよびRFIDリーダー をLAN接続。

     2.データ取得: PC上で動作するアプリケーションが、同じネットワーク内のRFIDリーダーを制御して、データを読み取ります。

    ・データフロー:

     1.PC上のアプリケーションが、そのデータをインターネット経由でAzure App Service上で公開されているWeb APIのエンドポイントへ送信します。

     2.最終的に、一般ユーザーがブラウザからApp Service上のWebページにアクセスし、その格納されたデータを閲覧します。

    【ご質問】

     1.このような「ローカルPCのアプリから、App ServiceのAPIを呼び出してデータを集約する」という構成は、Azureを利用する上で一般的な、あるいは推奨されるアーキテクチャでしょうか。

     2.この構成全体(データ取得 → API連携 → Web表示)において、最終的にユーザーが見るWebページで日本語が文字化けしないようにするために、Azure側で特に注意すべき設定(App Serviceの構成、HTTPヘッダーの扱い、データベースの照合順序など)はございますでしょうか。

     3.また、ローカルPCからApp Serviceへの通信を安全に行うためのセキュリティ上のベストプラクティス(IP制限、認証方法など)についても、改めてご教示いただけますと幸いです。

    お忙しいところ大変恐縮ですが、ご回答いただけますと幸いです。

    よろしくお願いいたします。


お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。