2011-03-08 4 views
19

thisはAzureデプロイされたアプリケーションで簡単な従来のログを記録する最も最適な方法ですか?Azureに配備された.Netに優先的にログインする方法

実際のファイルなどを取得するために多くの作業のように感じている場合は...あなたのために最高の仕事を何

+1

[ベストプラクティスのログとトレースのネット](http://programmers.stackexchange.com/questions/57064/best-practices-for-logging-and-tracing-in- net /)プログラマで.stackexchangeも役に立ちます – k3b

答えて

8

Azureテーブルストレージに書き込む診断プログラムのビルドを使用します。ログに書き込まれたメッセージが必要なときは、いつでも「Trace.WriteLine(...)」です。

ログはAzureテーブルストレージに書き込まれるため、ログメッセージをダウンロードしてテーブルストレージから削除するプロセスがあります。これは私たちのためにはうまくいくが、おそらくアプリケーションに依存していると思う。

http://msdn.microsoft.com/en-us/library/gg433048.aspx

それが役に立てば幸い! Brostoの答えにビットを追加する

[更新]

public void GetLogs() { 
     int cnt = 0; 
     bool foundRows = false; 
     var entities = context.LogTable; 
     while (1 == 1) { 
      foreach (var en in entities) { 
       processLogRow(en); 
       context.DeleteObject(en); 
       cnt++; 
       try { 
        if (cnt % 100 == 0) { 
         foundRows = true; 
         context.SaveChanges(SaveChangesOptions.Batch); 
        } 
       } catch (Exception ex) { 
        Console.WriteLine("Exception deleting batch. {0}", ex.Message); 
       } 
      } 
      if (!foundRows) 
       break; 
      else { 
       context.SaveChanges(SaveChangesOptions.Batch); 
      } 
      foundRows = false; 
     } 
     Console.WriteLine("Done! Total Deleted: {0}", cnt); 
    } 
+0

ダウンローダコードがどこかに投稿される可能性はありますか?私はちょうど同じようなことをする準備ができています。 –

+1

完全なコードはどこにでも掲載されていませんが、この記事をログをダウンロードするメインループで更新します。これはどのように動作するかをあなたに知らせるはずです。 – Brosto

+0

この回答には、問題を攻撃する1つの方法しか記載されていません。通常、最新のデータを保持するためだけにローリング方式でディスクにログを記録し、現在データをロールアップできないAzureストレージアカウントにもログを記録します。さらに、Systems.Diagnostics.Traceの代わりにEventSource(ETW)を使用することをお勧めします。これは、ETWを通じて書式設定を制御できるためです。 – user3613932

6

:それはAzureの診断を設定するには、わずか数行のコードを取ります。キャプチャするレベル(冗長、情報など)を決定します。ローカルにキャッシュされたログメッセージをAzureストレージにプッシュする頻度(通常は15分間隔など)すべてのインスタンスからのログメッセージは、同じテーブルに集約され、ロールとインスタンスを定義するプロパティを使用して簡単にクエリ可能(またはダウンロード可能)になります。

などTrace.TraceError()、Trace.TraceWarning()、などの追加のトレースステートメント、

は、あなたも、トレースリスナーを作成し、ローカルマシン上のほぼリアルタイムであなたのログ出力を見ることができますがあります。 Azure AppFabric SDKサンプルzipには、これを行うためのサンプル(\ ServiceBus \ Scenarios \ CloudTraceの下)が含まれています。

2

すでに述べたように、Windows Azure Diagnosticsを使用することができます。ただし、すべてのインスタンスからのログはすべて1つの大きなリストで終わります。これは読みにくい場合があります。したがって、診断テーブルに比較的重要なメッセージ(警告レベル以上)を送信するようにしています。それでもテーブルを直接読むのは苦痛です。そこにはいくつかのツールがあり、私は個人的にCerebrata Diagnostics Managerを使用しています。

Trace関数を直接使用することはできますが、NLogやlog4netなどのログフレームワークを使用することをおすすめします。これにより、Trace/Azure Diagnosticsなどのメッセージをローカルストレージに送信する柔軟性がさらに強化されます。

たとえば、スレッドハングの問題を追跡するためにトレースロギングを追加しました。私は、 "\ ServiceLogs \ MyLog.txt"のようなルート相対ファイルパスを与えると、インスタンス上のF:ドライブに出力されることがわかりました。そこで、私はすべてを診断テーブルではなくインスタンスファイルシステムにルーティングしました。これらのログを見るには、それぞれのインスタンスを遠隔操作する必要がありますが、この状況では良いトレードオフです。

2

私はAzure診断モニタトレースリスナを指し示すエンタープライズライブラリ5.0ロギングアプリケーションブロックを使用します。私が見た最高のソリューションをログに記録するエラーの

Enterprise Library on Windows Azure

4

Elmahです。 SQLデータベースが必要ですが、これは実際に問題を診断するのに役立つエラーログツールです。Azureではうまく動作します。

+2

テーブルストレージで動作するようにELMAHを設定できます。たとえば、http://www.wadewegner.com/2011/08/using-elmah-in-windows-azure-with-table-storage/を参照してください。 – Sam

3

私のすべてのAzureサイトについて、私はAzureテーブルへのカスタムログを使用します。もう少し作業はしていますが、保存される情報をより詳細に制御できることがわかります。上記のBrostoのように、ローカルシステムにログを定期的にダウンロードするローカルプロセスを用意することが最善です。 TableServiceEntityからクラスを派生させる場合は、ログに記録するすべてのフィールドを含む構造体を定義し、同じクラスを使用してローカルアプリケーションでログを取得するデータを取得できます。私はlogging using Azure table storageページでこれを行うためのコードの例をいくつか保持しています。

Trace.Writelineメソッドを使用したときに経験した問題の1つは、ログがローカルインスタンスに格納され、定期的にAzureテーブルストレージに転送されることです。 Azureインスタンスの一時的な性質を考えると、すべてのローカルストレージを最高で一時的に考慮する必要があります。したがって、ログデータがローカルドライブに保持されている間は、常にログデータを失うウィンドウがあります。

Azureテーブルストレージトランザクションのコストを考えると、Azureストレージに直接ロギングするのは非常にコスト効率が良い方法です。パフォーマンスが重大な問題である場合は、独立したスレッド(または複数のスレッド)をロギングデータのメモリ保持キューに提供することをお勧めします。 Azureインスタンスがリサイクルされている場合、これは明らかに一時的なデータに同様の問題をもたらしますが、これが発生するウィンドウははるかに小さくする必要があります。

0

Story frameworkは実際にログを読みたいときに役立ちますが、後で読む必要があるときにはすべてのログを書き込んで(そして他の関連情報を追加します)あなたが必要とするすべて。

また、Azureテーブルストレージへのログの永続化もサポートしています。

さらに詳しい情報とサンプルはthis blog postです。

関連する問題