我正在编写一个ASP.NET MVC 3应用程序,其中包含许多不是特定于Web的类。由于对审计跟踪的严格要求,所有可疑活动都应记录用户ID和IP地址。
这种日志记录通常如何进行? IP地址是否仅在登录控制器上记录?如果是这样,用户ID如何传递到需要进行日志记录的所有位置?将它作为参数添加到每个方法听起来不是一个好主意。
答案 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")
。
是的,这假设你正在使用依赖注入和对接口编程,但你应该是:)