在 Azure SDK for Java 中配置日誌

本文概述如何啟用使用 Azure SDK for Java 的應用程式登入。 Java 的 Azure 用戶端函式庫提供兩種日誌選項:

  • 用於暫時偵錯的內建記錄架構。
  • 支援使用 SLF4J 介面進行日誌記錄。

用 SLF4J 是因為它在 Java 生態系中很有名,且有完善的說明。 如需詳細資訊,請參閱 SLF4J 使用者手動

本文連結至涵蓋許多熱門 Java 記錄架構的其他文章。 這些其他文章提供了設定範例,並說明 Azure 用戶端函式庫如何使用日誌框架。

無論您使用哪種記錄組態,都會得到相同的記錄輸出,因為 Java 的 Azure 用戶端程式庫中的所有記錄輸出都會透過 azure-core ClientLogger 抽象層傳遞。

本文的其餘部分詳述所有可用記錄選項的設定。

啟用 HTTP 請求與回應記錄

HTTP 要求和回應記錄預設為關閉。 您可以設定透過 HTTP 與 Azure 服務通訊的用戶端,針對他們收到的每個要求和回應(或例外狀況)寫入記錄檔記錄。

如果您使用 OpenTelemetry,請考慮使用分散式追蹤,而不是記錄 HTTP 要求。 如需詳細資訊,請參閱 在 Azure SDK for Java 中設定追蹤

使用環境變數設定 HTTP 記錄

使用 AZURE_HTTP_LOG_DETAIL_LEVEL 環境變數開啟所有用戶端的 HTTP 日誌。 將此變數設為以下其中一個值:

  • NONE:HTTP 日誌關閉。 此值為預設值。
  • BASIC: HTTP 日誌包括請求方法、消毒後的請求 URL、嘗試次數、回應代碼,以及請求與回應內容的長度。
  • HEADERS:HTTP 記錄包含所有基本詳細數據,也包含已知安全用於記錄用途的標頭,亦即,它們不包含秘密或敏感性資訊。 HttpLogOptions 類別中提供標頭名稱的完整清單。
  • BODY_AND_HEADERS:HTTP 記錄包含 HEADERS 層級所提供的所有詳細資訊,並且包含要求和回應內容,只要它們小於 16 KB 且能列印。

備註

要求 URL 已淨化 - 也就是說,除了 api-version 的值之外,所有查詢參數值都會被遮蔽。 個別客戶端函式庫可能會將已知安全的查詢參數加入允許清單。

例如,Azure Blob 記憶體共用存取簽章 (SAS) URL 會以下列格式記錄: https://myaccount.blob.core.windows.net/pictures/profile.jpg?sv=REDACTED&st=REDACTED&se=REDACTED&sr=REDACTED&sp=REDACTED&rscd=REDACTED&rsct=REDACTED&sig=REDACTED

警告

不要在生產環境中記錄請求和回應實體,因為它們可能包含敏感資訊、大幅影響效能、改變內容緩衝方式,還有其他副作用。

在程式代碼中設定 HTTP 記錄

實作 HttpTrait<T> 介面的 Azure 用戶端產生器支援以程式代碼為基礎的 HTTP 記錄組態。 程式代碼型組態適用於個別客戶端實例,相較於環境變數組態,提供更多選項和自定義。

若要設定記錄,請將 HttpLogOptions 的實例傳遞至 httpLogOptions 對應客戶端產生器上的方法。 下列程式代碼顯示應用程式組態服務的範例:

HttpLogOptions httpLogOptions = new HttpLogOptions()
        .setLogLevel(HttpLogDetailLevel.HEADERS)
        .addAllowedHeaderName("Accept-Ranges")
        .addAllowedQueryParamName("label");

ConfigurationClient configurationClient = new ConfigurationClientBuilder()
        .httpLogOptions(httpLogOptions)
        ...
        .buildClient();

此程式代碼會啟用具有標頭的 HTTP 記錄,並將Accept-Ranges響應標頭和label查詢參數添加至對應的允許清單。 此變更後,這些數值會出現在產生的日誌中。

如需組態選項的完整清單,請參閱 HttpLogOptions 檔。

預設記錄器(用於暫時偵錯)

如前所述,所有 Azure 用戶端連結庫都會使用 SLF4J 進行記錄,但有後援的默認記錄器內建於適用於 Java 的 Azure 用戶端連結庫。 這個預設記錄器是針對你部署應用程式需要記錄,但無法重新部署包含 SLF4J 記錄器的應用程式的情況。 要啟用此記錄器,首先確保沒有 SLF4J 記錄器(因為它優先),然後設定 AZURE_LOG_LEVEL 環境變數。 下表顯示此環境變數允許的值:

日誌等級 允許的環境變數值
詳細 verbosedebug
資訊 infoinformationinformational
警告 warnwarning
錯誤 errerror

設定環境變數後,重新啟動應用程式以啟用該環境變數。 此記錄器會記錄至主控台,而且不提供 SLF4J 實作的進階自定義功能,例如變換和記錄至檔案。 要關閉登出,請移除環境變數並重新啟動應用程式。

SLF4J 記錄

預設情況下,請使用 SLF4J 支援的日誌框架來設定日誌。 首先,將相關的 SLF4J 紀錄實作添加為您專案的相依性。 如需詳細資訊,請參閱在 SLF4J 使用者手冊中 宣告專案相依性以進行記錄 。 接下來,將您的記錄器設定為在您的環境中必要時運作,例如設定記錄層級、配置哪些類別進行和不進行記錄等等。 本文中的連結提供一些範例,但如需詳細資訊,請參閱所選記錄架構的檔。

記錄格式

記錄架構支援自定義記錄訊息格式設定和版面配置。 請至少包含以下欄位,以便進行 Azure 用戶端函式庫的故障排除:

  • 具有毫秒精確度的日期和時間
  • 記錄嚴重性
  • 記錄器名稱
  • 執行緒名稱
  • 訊息

如需範例,請參閱您所使用之記錄架構的文件。

結構化記錄

除了記錄先前所述的一般屬性之外,Azure 用戶端連結庫也會在適用時標註具有額外內容的記錄訊息。 例如,您可能會看到 JSON 格式的記錄,其中包含以 az.sdk.message 其他根屬性撰寫的內容,如下列範例所示:

16:58:51.038 INFO  c.a.c.c.i.C.getManifestProperties - {"az.sdk.message":"HTTP request","method":"GET","url":"<>","tryCount":"1","contentLength":0}
16:58:51.141 INFO  c.a.c.c.i.C.getManifestProperties - {"az.sdk.message":"HTTP response","contentLength":"558","statusCode":200,"url":"<>","durationMs":102}

當您將記錄傳送至 Azure 監視器時,您可以使用 Kusto 查詢語言 來剖析記錄。 下列查詢提供範例:

traces
| where message startswith "{\"az.sdk.message"
| project timestamp, logger=customDimensions["LoggerName"], level=customDimensions["LoggingLevel"], thread=customDimensions["ThreadName"], azSdkContext=parse_json(message)
| evaluate bag_unpack(azSdkContext)

備註

Azure 客戶端函式庫記錄是用於臨時偵錯。 不要依賴日誌格式來提醒或監控你的應用程式。 Azure 用戶端函式庫無法保證日誌訊息或上下文金鑰的穩定性。 為此,請使用分散式追蹤。 Application Insights Java 代理程式提供請求和依賴性遙測的穩定保證。 如需詳細資訊,請參閱 在 Azure SDK for Java 中設定追蹤

後續步驟

現在您已知道記錄如何在適用於 Java 的 Azure SDK 中運作,請考慮檢閱下列文章。 這些文章提供如何設定一些較常用 Java 記錄架構以使用 SLF4J 和 Java 用戶端連結庫的指引: