2011-08-13 12 views
2

Web専用ではないクラスがたくさんあるASP.NET MVC 3アプリケーションを作成しています。監査証跡の厳しい要件のため、すべての疑わしいアクティビティはユーザーIDとIPアドレスでログに記録する必要があります。IPアドレスを使用したアプリケーションワイドロギングのパターン

通常、この種のログはどのように行われますか? IPアドレスはログインコントローラでのみ記録されていますか?もしそうなら、ロギングが必要なすべての場所にユーザーIDがどのように渡されますか?それを各メソッドのパラメータとして追加することは良い考えのようには思えません。

答えて

3

私はあなたが認証されたユーザーの身元を意味するユーザーIDを前提としています。

この情報はコントローラ内ですでに利用可能なため、渡す必要はありません。ユーザーのIPアドレスについては

User.Identity.Name

:現在のユーザーのために

Request.UserHostAddress

しかし、ロギングは通常、アプリケーションの幅です。 System.Webに依存することなく、アプリケーションのすべての領域で使用できるロガーインタフェースを作成する必要があります。例えば

public interface ILogger { 
    void Log(string message); 
} 

その後、ユーザーIDとIPアドレスを取得するには、現在のHttpContextを呼び出し、このの実装を作成することができます。

public class MyLogger : ILogger { 

    public void Log(string message) { 

     var sb = new StringBuilder(); 

     var context = HttpContext.Current; 

     if (context != null) { 
      sb.AppendLine("User: " + context.User.Identity.Name); 
      sb.AppendLine("IP: " + context.Request.UserHostAddress); 
     } 

     sb.AppendLine("Message: " + message); 

     // store the message somewhere (db, file). 
     // e.g. messageRepository.Save(sb.ToString()); 
    } 
} 

次にあなたがちょうどあなたのIoCコンテナがあなたのために注入し、その後、ちょうどlogger.Log("some message")を呼び出すことができますILoggerです、依存を取る(どこでも、あなたのアプリケーションに)何かをログに記録する必要があるとき。

はい、これは依存性注入とインターフェイスに対するプログラミングを使用していることを前提としていますが、そうする必要があります。

関連する問題