.NET 用クライアントライブラリを使用したクライアント側のログ記録

.net 用の Azure Storage クライアントライブラリ (バージョン2.1 以降) では、標準の .net 診断インフラストラクチャを使用して、.net クライアントアプリケーション内から Azure Storage 要求をログに記録できます。 この方法では、クライアントから Azure Storage サービスに送信される要求と、受信した応答の詳細を確認できます。

Azure Storage クライアントライブラリを使用すると、ログに記録できるストレージ要求を制御できます。また、.net 診断インフラストラクチャを使用すると、ログデータを送信する場所など、ログデータを完全に制御できます。 たとえば、ログデータをファイルまたはアプリケーションに送信して処理できるようにすることができます。 Azure Storage Analytics とネットワーク監視を組み合わせると、クライアントライブラリのログ記録を使用して、アプリケーションが Azure Storage サービスとどのように対話するかを詳細に把握することができます。 詳細については、「 Azure Storage の監視、診断、およびトラブルシューティング」を参照してください。

クライアントライブラリのログ記録を有効にする方法

次の例では、ストレージ ログ メッセージを回収し、テキスト ファイルに保存するために必要な system.diagnostics 構成を示します。 構成セクションは、app.config ファイルまたは web.config ファイルに追加できます。

注意

10.0.0 よりも前のバージョンを使用している場合は、の代わりに名前を使用し Microsoft.WindowsAzure.Storage Microsoft.Azure.Storage ます。

<system.diagnostics>  
     <!--In a dev/test environment you can set autoflush to true in order to autoflush to the log file. -->  
  <trace autoflush="false">  
    <listeners>  
      ...
      <add name="storageListener" />  
    </listeners>  
  </trace>  
  <sources>  
    <source name="Microsoft.Azure.Storage">  
      <listeners>  
        <add name="storageListener"/>  
      </listeners>  
    </source>  
  </sources>  
  <switches>  
    <add name="Microsoft.Azure.Storage" value="Verbose" />  
  </switches>  
  <sharedListeners>  
    <add name="storageListener"  
      type="System.Diagnostics.TextWriterTraceListener"  
      initializeData="C:\logs\WebRole.log"
      traceOutputOptions="DateTime" />  
  </sharedListeners>  
</system.diagnostics>  
  

注意

Azure Storage ライブラリの .NET Standard 2.0 アイテムを使用すると、Visual Studio の NuGet パッケージマネージャーによって自動的に選択される可能性があるため、バージョン 4.6.1-4.7.1 (包括) を使用しているユーザー .NET Framework、ログ記録の問題が発生する可能性があります。 これらのライブラリは .NET Framework 4.5.2 アーティファクトとしても公開されますが、これらの問題は発生しません。 詳細については、 .NET Standard バージョンのサポートに関する説明を参照してください。

この例では、ログメッセージを物理ファイルに書き込むようにクライアントライブラリを構成し C:\logs\WebRole.log ます。 また、 EventLogTraceListener などの他のトレースリスナーを使用して Windows イベントログに書き込むことも、書き込む を使用して ETW サブシステムにトレースデータを書き込むこともできます。

重要

ログファイルの完全なフォルダーパスは、ローカルファイルシステムに存在する必要があります。 この例では、最初にフォルダーを作成し C:\logs てから、そのフォルダー内のファイルにログを書き込む必要があります。

さらに、 autoflush を true に設定すると、ログエントリをバッファリングするのではなく、ファイルに直ちに書き込むことができます。 この設定は、大量のトレースメッセージを含む開発/テスト環境で役立ちますが、運用環境では autoflush を false に設定することもできます。 クライアントのすべてのストレージ操作に対して、構成設定を使用して、クライアントのトレースを有効にする (および、すべてのメッセージに対して 詳細 などのレベルを指定する) ことができます。

Id ログ レベル イベント
0 オフ ログには何も記録されません。
1 エラー 例外を内部で処理できず、ユーザーにスローされた場合は、エラーとしてログに記録されます。
2 警告 例外がキャッチされ、内部で処理される場合は、警告としてログに記録されます。 このログレベルの主なユースケースは再試行シナリオです。この場合、ユーザーに対して例外がスローされて再試行されることはありません。 この動作は、CreateIfNotExists などの操作でも発生する可能性があります。この場合、404エラーは自動的に処理されます。
3 Informational 次の情報がログに記録されます。

•ユーザーがメソッドを呼び出して操作を開始した直後に、URI やクライアントの要求 ID などの要求の詳細がログに記録されます。

•送信要求の開始/終了、アップロードデータの開始/終了、受信応答の開始/終了、ダウンロードデータの開始/終了などの重要なマイルストーンは、タイムスタンプをマークするためにログに記録されます。

•ヘッダーを受信した直後に、要求 ID や HTTP 状態コードなどの応答の詳細がログに記録されます。

•操作が失敗し、ストレージクライアントが再試行を決定した場合、その決定の理由は、次回の再試行が行われるタイミングに関する情報と共に記録されます。

•ストレージクライアントが保留中の要求を中止する場合は、すべてのクライアント側のタイムアウトがログに記録されます。
4 "詳細" 次の情報がログに記録されます。

•要求ごとに署名する文字列。

•操作 (定義して使用する各操作まで) に固有の追加情報。

既定では、クライアントライブラリは、構成ファイルで指定した詳細レベルですべてのストレージ操作の詳細をログに記録します。 また、ログ記録をクライアントアプリケーションの特定の領域に制限して、ログに記録されるデータ量を減らし、必要な情報を見つけることもできます。 ログに書き込まれるデータの量を制限するには、クライアントアプリケーションにコードを追加する必要があります。 通常、構成ファイルでクライアント側のトレースを有効にした後、 OperationContext クラスを使用して、コード内でグローバルにオフにします。 たとえば、アプリケーションでストレージ操作を実行する前に、 Application_Start メソッドの ASP.NET MVC アプリケーションでこれを行うことができます。

protected void Application_Start()  
{  
    ...  
  
    // Disable Default Logging for Windows Azure Storage  
    OperationContext.DefaultLogLevel = LogLevel.Off;  
  
    // Verify that all of the tables, queues, and blob containers used in this application  
    // exist, and create any that don't already exist.  
    CreateTablesQueuesBlobContainers();  
}  

その後、ログ記録レベルを定義するカスタム OperationContext オブジェクトを作成することによって、関心のある特定の操作のトレースを有効にすることができます。 次に、次の例に示すように、ストレージ操作を呼び出すために使用する Execute メソッドにパラメーターとして OperationContext オブジェクトを渡します。

[HttpPost]  
[ValidateAntiForgeryToken]  
public ActionResult Create(Subscriber subscriber)  
{  
    if (ModelState.IsValid)  
    {  
       ...  
        var insertOperation = TableOperation.Insert(subscriber);  
        OperationContext verboseLoggingContext = new OperationContext() { LogLevel = LogLevel.Verbose };  
        mailingListTable.Execute(insertOperation, null, verboseLoggingContext);  
        return RedirectToAction("Index");  
    }  
  
    ...  
    return View(subscriber);  
}  
  

クライアント側のログ スキーマとサンプル

次の例は、 c3aa328b を含むクライアント要求 ID を持つ操作のクライアントライブラリによって生成されるクライアント側ログからの抽出です。 クライアント要求 ID は、クライアント側でログに記録されたメッセージがネットワークトレースおよびストレージログと関連付けられるようにする関連付け識別子です。 相関関係の詳細については、「 Azure Storage の監視、診断、およびトラブルシューティング」を参照してください。 この抜粋には、ログ ファイルで気付く一部の主要情報に関する解説が含まれます (斜体で字下げされます)。

次のログファイルの最初の行を使用してこの機能を説明するために、フィールドは次のとおりです。

ログフィールド
ソース Microsoft.Azure.Storage
出力 情報
詳細度の数 3
クライアント要求 ID c3aa328b...
[操作テキスト] 場所 Primary、場所モード PrimaryOnly で操作を開始しています。

Microsoft.Azure.Storage Information: 3 : c3aa328b...: Starting operation with location Primary per location mode PrimaryOnly.
上のトレースメッセージは、 ロケーションモード がプライマリのみに設定されていることを示しています。つまり、失敗した要求は2次拠点には送信されません。
Microsoft.Azure.Storage Information: 3 : c3aa328b...: Starting synchronous request to https://storageaccountname.table.core.windows.net/mailinglist.
上のトレースメッセージは、要求が同期であることを示しています。
Microsoft.Azure.Storage Information: 3 : c3aa328b...: Setting payload format for the request to 'Json'.
上記のトレースメッセージは、応答が JSON として書式設定されていることを示しています。
Microsoft.Azure.Storage Verbose: 4 : c3aa328b...: StringToSign = GET...Fri, 23 May 2014 06:19:48 GMT./storageaccountname/mailinglist.
前のトレースメッセージには StringToSign 情報が含まれており、これは認証エラーのデバッグに役立ちます。詳細メッセージには、操作の種類と要求パラメーターを含む完全な要求の詳細も含まれます。
Microsoft.Azure.Storage Information: 3 : c3aa328b...: Waiting for response.
上のトレースメッセージは、要求が送信され、クライアントが応答を待機していることを示しています。
Microsoft.Azure.Storage Information: 3 : c3aa328b...: Response received. Status code = 200, Request ID = 417db530-853d-48a7-a23c-0c8d5f728178, Content-MD5 = , ETag =
上記のトレースメッセージは、応答が受信されたことと、その http 状態コードを示しています。
Microsoft.Azure.Storage Information: 3 : c3aa328b...: Response headers were processed successfully, proceeding with the rest of the operation.
Microsoft.Azure.Storage Information: 3 : c3aa328b...: Processing response body.
Microsoft.Azure.Storage Information: 3 : c3aa328b...: Retrieved '8' results with continuation token ''.
上記のトレースメッセージは、8つの結果が取得され、継続トークンが提供されていないことを示しています。つまり、このクエリの結果はこれ以上ありません。
Microsoft.Azure.Storage Information: 3 : c3aa328b...: Operation completed successfully.
上のトレースメッセージは、操作が正常に完了したことを示しています。

次の2つの詳細 (レベル 4) のログエントリは、HEAD および DELETE 要求を示し、 操作テキスト フィールドの詳細情報を示しています。
Microsoft.Azure.Storage Verbose: 4 : 07b26a5d...: StringToSign = HEAD............x-ms-client-request-id:07b26a5d....x-ms-date:Tue, 03 Jun 2014 10:33:11 GMT.x-ms-version:2014-02-14./storageaccountname/azuremmblobcontainer.restype:container.
Microsoft.Azure.Storage Verbose: 4 : 07b26a5d...: StringToSign = DELETE............x-ms-client-request-id:07b26a5d....x-ms-date:Tue, 03 Jun 2014 10:33:12 GMT.x-ms-version:2014-02-14./storageaccountname/azuremmblobcontainer.restype:container.
上のトレースメッセージは、詳細トレースメッセージ内の OperationText フィールドを示しています。これには、特定の要求に関連する詳細情報が含まれます。これらの詳細には、HTTP 操作の種類 (HEAD、DELETE、POST など)、クライアント要求 ID、タイムスタンプ、SDK のバージョン、およびその他の操作固有のデータが含まれます。