使用IP地址进行应用程序范围记录的模式

时间:2011-08-13 05:57:05

标签: asp.net-mvc-3 logging

我正在编写一个ASP.NET MVC 3应用程序,其中包含许多不是特定于Web的类。由于对审计跟踪的严格要求,所有可疑活动都应记录用户ID和IP地址。

这种日志记录通常如何进行? IP地址是否仅在登录控制器上记录?如果是这样,用户ID如何传递到需要进行日志记录的所有位置?将它作为参数添加到每个方法听起来不是一个好主意。

1 个答案:

答案 0 :(得分:3)

我假设用户ID,表示经过身份验证的用户的身份。

无需传递此信息,因为它已在您的控制器中可用。

对于当前用户:

User.Identity.Name

对于用户的IP地址:

Request.UserHostAddress

但是,日志记录通常是应用程序范围的。您应该创建一个可供应用程序的所有区域使用的记录器接口,而无需依赖System.Web。

例如:

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

然后,您可以创建此实现,调用当前的HttpContext以获取用户身份和IP地址。

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());
    }
}

然后,当您需要记录某些内容(在应用程序中的任何位置)时,您只需依赖ILogger,您的IoC容器可以为您注入,然后只需调用logger.Log("some message")

是的,这假设你正在使用依赖注入和对接口编程,但你应该是:)