【Azure API 管理】在APIM 中新增 log-to-eventhub 策略,把 Request Body 資訊全部記錄在Event Hub中

路邊兩盞燈 發表於 2021-12-01

問題描述

根據文件 https://docs.azure.cn/zh-cn/api-management/api-management-howto-log-event-hubs , 可以將Azure API Management中的請求記錄到Azure 事件中心。文件中有詳細的步驟描述。但是在對於如何建立APIM的Logger, 如何在API中配置策略描述非常不清楚,所以本文就補充如何建立Logger及在APIM的API中新增log-to-eventhub 策略。

前提條件

  • Postman

 

操作步驟

1) 建立APIM Logger 

示例

 PUT https://management.chinacloudapi.cn/subscriptions/<your subscription id>/resourceGroups/<group name>/providers/Microsoft.ApiManagement/service/<your apim name>/loggers/<loggerideh01>?api-version=2020-12-01

注:替換<>中的內容為自己的相應資源資訊,同時也定義loggers的名稱。

       這裡的Endpoint為中國區Azure的Endpoint: https://management.chinacloudapi.cn/, 如果需要Global Azure,則為:https://management.azure.com/

Authorization

兩種方式任選其一:

  1. Azure Active Directory OAuth2 Flow :  https://www.cnblogs.com/lulight/p/14279338.html
  2. 似乎用瀏覽器開啟Azure APIM的門戶,通過F12--開發者選項中的 Network, 檢視其中對API的請求,複製其中的Authorization 值

【Azure API 管理】在APIM 中新增 log-to-eventhub 策略,把 Request Body 資訊全部記錄在Event Hub中

 

 

Body

{
  "properties": {
    "loggerType": "azureEventHub",
    "description": "adding a new logger",
    "credentials": {
      "name": "<your event hub name>",
      "connectionString": "Endpoint=sb://<your event hub namespace>.servicebus.chinacloudapi.cn/;SharedAccessKeyName=xxxxxxxxxxxxxxxxx;SharedAccessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    }
  }
}

 

Response - 201 Created 

{
    "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/xxxx-rg/providers/Microsoft.ApiManagement/service/xxxx/loggers/loggerideh01",
    "type": "Microsoft.ApiManagement/service/loggers",
    "name": "loggerideh01",
    "properties": {
        "loggerType": "azureEventHub",
        "description": "adding a new logger",
        "credentials": {
            "name": "xxxxxxxxxxxx",
            "connectionString": "{{Logger-Credentials--xxxxxxxxxxxx}}"
        },
        "isBuffered": true,
        "resourceId": null
    }
}

演示動畫

【Azure API 管理】在APIM 中新增 log-to-eventhub 策略,把 Request Body 資訊全部記錄在Event Hub中

 

2) 新增 log-to-eventhub 策略

  1. 瀏覽到自己的 APIM 例項。
  2. 選擇“API”選項卡。
  3. 選擇要將策略新增到的 API。
  4. 選擇“所有操作”。
  5. 選擇螢幕頂部的“設計”選項卡。
  6. 在“入站或出站處理”視窗中,單擊三角形(鉛筆旁邊)。
  7. 選擇“程式碼編輯器”。 有關詳細資訊,請參閱如何設定或編輯策略
  8. 將游標放在 inbound 或 outbound 策略部分中。
  9. 在右側視窗中,選擇“高階策略” > “記錄到 EventHub”。 這會插入 log-to-eventhub 策略語句模板。

【Azure API 管理】在APIM 中新增 log-to-eventhub 策略,把 Request Body 資訊全部記錄在Event Hub中

 

注: Log-to-eventhub 中的logger-id由上面第一步建立。 Request Body的資訊一定要進行格式轉換。所以需要使用   context.Request.Body.As<string>() 

 

<policies>
    <inbound>
        <base />
        <log-to-eventhub logger-id="loggerideh01">@{
        return new JObject(
            new JProperty("EventTime", DateTime.UtcNow.ToString()),
            new JProperty("ServiceName", context.Deployment.ServiceName),
            new JProperty("RequestId", context.RequestId),
            new JProperty("RequestBody1", context.Request.Body.As<string>()),
            new JProperty("OperationName", context.Operation.Name)
        ).ToString();
    }</log-to-eventhub>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
        <log-to-eventhub logger-id="loggerideh01">@{
        return new JObject(
            new JProperty("EventTime", DateTime.UtcNow.ToString()),
            new JProperty("ServiceName", context.Deployment.ServiceName),
            new JProperty("RequestId", context.RequestId),
            new JProperty("RequestBody2", context.Response.Body.As<string>()),
            new JProperty("OperationName", context.Operation.Name)
        ).ToString();
    }</log-to-eventhub>
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

 

 

3) 連線到Event Hub,檢視 Request Body 資訊

下載zip包,解壓後在裡面找到檔名為:ServiceBusExplorer.exe。 雙擊即可執行

【Azure API 管理】在APIM 中新增 log-to-eventhub 策略,把 Request Body 資訊全部記錄在Event Hub中

 

 

在下面的字串框中輸入Event Hub Namespace的連線字串。點選Save/ OK後,即可連線到Event Hub中。

【Azure API 管理】在APIM 中新增 log-to-eventhub 策略,把 Request Body 資訊全部記錄在Event Hub中

 

 

進入儲存日誌的Event Hub中,找到合適的分割槽數,點選“Create Partitions Listener ”, 然後再彈出的頁面中點選 “Strat”按鈕,就可以收到Event Hub中所儲存的訊息

【Azure API 管理】在APIM 中新增 log-to-eventhub 策略,把 Request Body 資訊全部記錄在Event Hub中

 

 

 

參考資料

如何在 Azure API 管理中將事件記錄到 Azure 事件中心 : https://docs.azure.cn/zh-cn/api-management/api-management-howto-log-event-hubs#configure-log-to-eventhub-policies

Logger - Create Or Update : https://docs.microsoft.com/zh-cn/rest/api/apimanagement/2020-12-01/logger/create-or-update#apimanagementcreateehlogger

建立 Azure 事件中心:https://docs.azure.cn/zh-cn/event-hubs/event-hubs-create 

下載 Service Bus Explorer檢視事件中心訊息:https://github.com/paolosalvatori/ServiceBusExplorer/releases