Asp.net 我在哪里可以在代码上设置日志机制

Asp.net 我在哪里可以在代码上设置日志机制,asp.net,logging,design-patterns,asp.net-web-api,Asp.net,Logging,Design Patterns,Asp.net Web Api,我正在使用asp.NETMVC应用程序,我对横切关注点很陌生。所以我需要知道在哪里可以使用下面的示例中的记录器代码 我有一个记录错误的界面。我正在我的代码上实现这个接口 public interface ILogger { void Log(Exception exception); } 所以我有Controller、ProductService和ProductRepository类 public interface ProductController: ApiController{

我正在使用asp.NETMVC应用程序,我对横切关注点很陌生。所以我需要知道在哪里可以使用下面的示例中的记录器代码

我有一个记录错误的界面。我正在我的代码上实现这个接口

public interface ILogger { void Log(Exception exception); }
所以我有Controller、ProductService和ProductRepository类

public interface ProductController: ApiController{

     public IHttpActionResult Get(){
            try {
                productService.GetProducts();
            }catch(Exception e){
                logger.Log(e); // 1-Should I use logging in here?
            }
     }
} 
产品服务

public class ProductService{
    public IEnumerable<Product> GetProducts(){
            try {
                productRepository.GetAll();
            }catch(Exception e){
                logger.Log(e); // 2-Should I use logging in here?
            }
    }   
}
公共类产品服务{
公共IEnumerable GetProducts(){
试一试{
productRepository.GetAll();
}捕获(例外e){
logger.Log(e);//2-我应该在这里使用登录吗?
}
}   
}
在存储库中

public class ProductRepository{
    public IEnumerable<Product> GetAll(){
            try {

            }catch(Exception e){
                logger.Log(e); // 3-Should I use logging in here?
            }
    }   
}
公共类产品存储库{
公共IEnumerable GetAll(){
试一试{
}捕获(例外e){
logger.Log(e);//3-我应该在这里使用登录吗?
}
}   
}

我无法确定在哪里可以使用日志代码。或者在任何地方添加登录。

您可以实现自定义异常过滤器

public class LogExceptionAttribute : ExceptionFilterAttribute
{
    public ILogger logger { get; set; }
    public LogExceptionAttribute(ILogger logger)
    {
        this.logger = logger;
    }

    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {
        var exception = actionExecutedContext.Exception;
        logger.Log(actionExecutedContext.Exception);

        // You could also send client a message about exception.
        actionExecutedContext.Response =
                actionExecutedContext.Request.CreateResponse(HttpStatusCode.InternalServerError, exception.Message);
    }
}
然后在全局级别注册它

GlobalConfiguration.Configuration.Filters.Add(new LogExceptionAttribute(Logger));

对于从控制器方法引发的任何未经处理的异常,都将调用此筛选器。

您应该使用MVC 3层体系结构。您必须从控制器调用服务,该服务将引用应负责日志记录的存储库。因此,如果在服务或存储库实现中发生异常,我将捕获ExceptionFilter。但我将向用户返回一条关于异常的用户友好消息。