Azure SDK for JavaのことがBlogで記事になっていたのでザックリ内容を確認しました。
原題は「in Azure Functions」とはなっていますが、Functionsに限らないSDK Loggingの話だと捉えた方がよさそうです。気をつけなくてはいけないのは、JavaのFunctionsでは、ロガーインスタンスはDIされないので、Contextオブジェクトから取得することになるくらいですちなみに、context.getLogger().info("hoge")
みたいになります。
話をSDKに戻しますと、SDKのログを取得できるのは内部動作の理解にも繋がりますし、デバッグ時にも大変有効な手段です。依然は、SDK毎にバラバラだった気がしますが、最近のAzure SDKはガイドラインに沿って作られているせいか、機能毎にそれほどばらつき無く実装されているような気がします。
Key Vaultの場合
大体のJava SDKはクライアントをBuilderパターンで構築しますが、そこにhttpLogOptions
を挟み込むだけでログが取得できます。無論、slf4jを介したログ出力になっているので、このあたりの設定は必要ですが、主要なフレームワーク(Spring Bootとかは)には組み込まれていると思うので、そのまま出力されるでしょう。
var kvCreds = new ClientSecretCredentialBuilder() .tenantId("") .clientId("") .clientSecret("") .build(); var logOptions = new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS); var secretClient = new SecretClientBuilder() .httpLogOptions(logOptions) .vaultUrl(kvUri) .credential(kvCreds) .buildClient();
Azure上にデプロイして動かないなど、Managed Idの設定ではまったりするので、ログが取得できるのは、どこに設定ミスがあるかを確認したりするうえで便利だと思います。
ログの種類
のとおり、NONE/BASIC/HEADERS/BODY/BODY_AND_HEADERSの5種類です。
- BASICは、URLとHTTPメソッドとリクエスト
- HEADERSは、BASICに加えてリクエストとレスポンスヘッダ
- BODYは、BASICにくわえリクエストとレスポンスボディ
- BODY_AND_HEADERSは、全部という感じです。
BASICの例は以下のような感じになります。
2020-09-29 11:08:59.585 INFO 60628 --- [ main] c.a.s.k.secrets.SecretAsyncClient : Retrieving secret - ConnectionString 2020-09-29 11:08:59.597 INFO 60628 --- [ main] c.a.s.k.secrets.SecretService.getSecret : --> GET https://xxxxyyyyzzz.vault.azure.net/secrets/ConnectionString/?api-version=REDACTED Try count: 1 2020-09-29 11:09:01.201 INFO 60628 --- [ctor-http-nio-1] c.a.s.k.secrets.SecretService.getSecret : <-- 401 https://xxxxyyyyzzz.vault.azure.net/secrets/ConnectionString/?api-version=REDACTED (1603 ms, 87-byte body) <-- END HTTP 2020-09-29 11:09:01.764 INFO 60628 --- [nPool-worker-19] c.azure.identity.ClientSecretCredential : Azure Identity => getToken() result for scopes [https://vault.azure.net/.default]: SUCCESS 2020-09-29 11:09:01.764 INFO 60628 --- [nPool-worker-19] c.a.s.k.secrets.SecretService.getSecret : --> GET https://xxxxyyyyzzz.vault.azure.net/secrets/ConnectionString/?api-version=REDACTED Try count: 1 2020-09-29 11:09:02.141 INFO 60628 --- [ctor-http-nio-3] c.a.s.k.secrets.SecretService.getSecret : <-- 200 https://xxxxyyyyzzz.vault.azure.net/secrets/ConnectionString/?api-version=REDACTED (377 ms, 302-byte body) <-- END HTTP 2020-09-29 11:09:02.175 INFO 60628 --- [ctor-http-nio-3] c.a.s.k.secrets.SecretAsyncClient : Retrieved secret - connectionString
Storageの場合
Storage SDKの場合も同じく、httpLogOptions
メソッドを挟み込めばOKです。
var storageClient = new BlobServiceClientBuilder() .httpLogOptions(logOptions) .endpoint(endpoint) .credential(storageCreds) .buildClient();
他のSDK
これ以外にCosmos SDKを試してみましたが、BuilderクラスにhttpLogOptions
メソッドは実装されていませんでした。まだ全てのSDKで使えるわけではなさそうです。(CosmosにはCosmos SDKのログの方法が提供されているとは思いますが)
というわけで、今回も誰得なブログでした。以上。