概要

Azureアプリ関数のログの参照方法について記載する。
以下、カスタムハンドラーを利用した関数アプリ(Go)となっている為、関数アプリのソースについてはデフォルトのサポート言語の場合と異なる場合もある。

目次

Application Insight の有効化

Application Insight を有効化した状態で Functions を作成しておくと、関数アプリのログを一定期間保持し、ログ検索やアラート設定を行う事ができる。

関数アプリをCLI で作成する場合

# application insight コンポーネントの作成
az monitor app-insights component create \
    --app $insightsName \
    --location $insightsRegion \
    --resource-group $resourceGroup \
    --query-access Enabled \
    --retention-time $insightsDays \     ... 保持期間(日数) ※30,60,90,120,180,270,365,550,730 の何れか
    --subscription $subscriptionId

# 関数アプリの作成
az functionapp create \
  --name $funcAppName \
    :
  --app-insights $insightsName    <-- これ

関数アプリをポータルから作成する場合

func_setting_insight1.png

カスタムハンドラを使用した関数アプリの場合

実装例

カスタムハンドラを使用した関数アプリでは返却データに "Logs" としてログデータを含める事で Application Insight にログを渡す事が出来る。
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-custom-handlers#response-payload

標準出力等に出力した内容も Application Insight には連携されるようだが、格納のされ方が若干異なる(後述)。

goのサンプル

    :

    logs := make([]string, 0)

    // 標準出力に表示
    fmt.Println("[INFO] This is std out message1.")
    fmt.Println("[INFO] This is std out message2.")

    // 戻り値(Logs)用の配列に追加
    logs = append(logs, "[INFO] Sample Log 1.")
    logs = append(logs, "[INFO] Sample Log 2.")

    :

    invokeResponse := InvokeResponse{Logs: logs, ReturnValue: string(returnValue)}  // 溜めたログを Logs として返却する
    js, err := json.Marshal(invokeResponse)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }   

    w.Header().Set("Content-Type", "application/json")
    w.Write(js)

ログの参照方法(ポータル)

ポータルからは対象の関数アプリの画面の [ログ] から検索画面に遷移する事ができる。
検索は Kustoというクエリ言語 で行うが、上記のようなログデータは traces というテーブルから検索する事ができる。(Kustoについては後述)

[参考] tracesテーブルの定義内容 ... https://docs.microsoft.com/en-us/azure/azure-monitor/reference/tables/traces

func_app_log_search0.png

func_app_log_search1.png

他にも Insight のデータを探索する方法はいくつか用意されている。(主にメトリクス)
https://docs.microsoft.com/ja-jp/azure/azure-monitor/app/app-insights-overview#where-do-i-see-my-telemetry

ログの参照方法(Azure CLI)

Azure CLI で検索して JSON を取得する事も可能。

az monitor app-insights query --analytics-query 'Kustoクエリ式' --apps Insight名 -g リソースグループ名

例)

query='traces | where cloud_RoleName == "myfuncapp" and message has_cs "[INFO]" | sort by timestamp asc | project timestamp, message | take 2'
az monitor app-insights query --analytics-query "${query}" --apps Insight名 -g リソースグループ名

{
  "tables": [
    {
      "columns": [
        {
          "name": "timestamp",
          "type": "datetime"
        },
        {
          "name": "message",
          "type": "string"
        }
      ],
      "name": "PrimaryResult",
      "rows": [
        [
          "2020-08-27T18:12:00.0483909Z",
          "[INFO] This is std out message1."
        ],
        [
          "2020-08-27T18:12:00.0485376Z",
          "[INFO] This is std out message2."
        ]
      ]
    }
  ]
}

標準出力 と Logs に設定したログの違い

標準出力ログとLogに設定したログでは Application Insight への格納のされ方が異なる。

以下は、Insight でログを検索した結果だが、標準出力に出力したもの(1) には、operation_Name が設定されていない事が分かる。
関数アプリ内に複数の関数がある場合、operation_Name を見れば、どの関数から出力されたものかが分かるが、標準出力ログからは判断できない為、
標準出力ログをトレース等に利用する場合は、各ログに関数が識別出来る内容を含む。等の工夫が必要と思われる。

func_app_log1.png

ログファイルの実物は何処から取得出来るのか

以下に説明があるように、関数アプリのコードは、ファイル共有を利用して各インスタンスにマウントされる。
https://docs.microsoft.com/ja-jp/azure/azure-functions/storage-considerations

で、このPATH配下にアプリケーションのログも格納されており、ストレージエクスプローラで見る場合ログのPATHは以下の通り。
※ただし、反映されるまでに数分かかる。(Application Insight もだが)

ログ 種別PATH
関数ログFile Shares(ファイル共有)関数アプリ名/LogFiles/Application/Functions/Function 配下
ホストログFile Shares(ファイル共有)関数アプリ名/LogFiles/Application/Functions/Host 配下

ホストログの格納場所

func_app_log2.png

関数ログには標準出力に出力した内容は含まれない為、関数自体が異常終了した場合等はホスト側のログから調査を行う必要がある。

ログの退避

診断設定を作成する事によってログを永続的に保管しておく事も出来る。
Application Insight のリテンションポリシー(保持期間)を超えて保持しておきたい場合は、こちらも設定しておくのが良いと思われる。
https://docs.microsoft.com/ja-jp/azure/azure-monitor/platform/diagnostic-settings

※ポータルからの設定手順は上記URLに記載がある。

Application Insight に送信するカテゴリとログレベルを構成する

host.json で構成する事ができる模様。

Azure Functions を監視する - カテゴリとログ レベルを構成する
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-monitoring?tabs=cmd#configure-categories-and-log-levels

Azure Functions 2.x 以降の host.json のリファレンス
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-host-json

アラートの設定

料金

https://azure.microsoft.com/ja-jp/pricing/details/monitor/ には下表の通り記載されている。(2020/8月現在)

Application Insights

機能含まれている無料ユニット料金
データ インジェスト1か月あたり課金アカウントごとに 5GB¥374.08/GB
データ保持90日(※)1GB あたり ¥16.80/月
複数ステップ Webテストなし¥1,120 /テスト/月
Web テストの ping無制限無料

※Application Insights によって取り込まれたデータは 1GB ずつ 90日間無料で保持される。


添付ファイル: filefunc_app_log_search0.png 8件 [詳細] filefunc_app_log_search1.png 6件 [詳細] filefunc_app_log1.png 7件 [詳細] filefunc_app_log2.png 6件 [詳細] filefunc_setting_insight1.png 6件 [詳細]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-08-31 (月) 08:57:01 (85d)