2011-06-28 8 views

答えて

1

複数のAzure Webロールのロギングライブラリとしてlog4netを使用しています。 log4net ADO.Netアペンダは、すべてのエラーをSQL Azureデータベースに記録するために使用されます。クライアント/ユーザーがログをフィルタするために、我々はいくつかのlog4net.GlobalContextのプロパティを使用し、そのよう:

log4net.GlobalContext.Properties["Domain"] = new Log4netDomainProvider(); 
log4net.GlobalContext.Properties["Username"] = new Log4netUsernameProvider(); 

各「プロバイダ」は、toString()メソッドをオーバーライドするだけの単純なクラスです。 log4netによってToString()が呼び出されると、現在のセッションから値を取得します(この手法については、SO answerで説明しています)。

public class Log4netDomainProvider 
{ 
    public override string ToString() 
    { 
     string retval = null; 

     if (HttpContext.Current == null) 
      retval = "HttpContext is null"; 
     else if (HttpContext.Current.Session == null) 
      retval = "HttpContext.Current.Session is null"; 
     else 
      retval = HttpContext.Current.Session["Domain"]; 

     return retval; 
    } 
} 

これはあなたの質問にお応えしたいと思います。もしそうなら、あなたはlog4netロギングコンテキストでこの良いwrite-upをチェックしたいかもしれません。

+0

ありがとうございました。私はこれを調べます。 RoleManager.WriteToLogも試しましたか?もしそうなら、あなたの経験は何でしたか? – iCode

+0

私たちはそれを見ましたが、ブロブストレージ内のログのヒープを手作業で選別したくはありませんでした。私たちの要件の1つは、クライアント/ユーザーの組み合わせで簡単にフィルタリングすることでした。私の答えでは言及していませんでしたが、リモートIPアドレスとマシン名を取得するためにlog4net.GlobalContextプロパティも使用します。フィルタリングオプションをさらに詳細にしたい場合は、Azureサービス管理APIを使用して、ロールが起動するときに静的変数にインスタンス番号、デプロイメント名などを格納することができます。これらの変数についてもlog4net "Providers"を作成することができます。 –

関連する問題