Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 具有IP地址的应用程序范围日志记录模式_Asp.net Mvc 3_Logging - Fatal编程技术网

Asp.net mvc 3 具有IP地址的应用程序范围日志记录模式

Asp.net mvc 3 具有IP地址的应用程序范围日志记录模式,asp.net-mvc-3,logging,Asp.net Mvc 3,Logging,我正在编写一个ASP.NET MVC 3应用程序,其中包含许多非web特定的类。由于对审计跟踪的严格要求,所有可疑活动都应记录用户ID和IP地址 public class MyLogger : ILogger { public void Log(string message) { var sb = new StringBuilder(); var context = HttpContext.Current; if (context

我正在编写一个ASP.NET MVC 3应用程序,其中包含许多非web特定的类。由于对审计跟踪的严格要求,所有可疑活动都应记录用户ID和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());
    }
}

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

我假设用户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容器可以为您注入ILogger,然后只需调用
logger.log(“某些消息”)

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