我在哪里可以将Logging机制放在​​我的代码上

时间:2017-07-19 12:36:52

标签: asp.net logging design-patterns asp.net-web-api

我正在使用asp.net mvc应用程序,而且我是关于交叉剪辑的新手。所以我需要知道在哪里可以使用我的记录器代码。

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

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?
            }
    }   
}

在存储库中。

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

            }catch(Exception e){
                logger.Log(e); // 3-Should I use logging in here?
            }
    }   
}

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

1 个答案:

答案 0 :(得分:0)

您可以实现自定义例外过滤器。

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

对于从控制器方法抛出的任何未处理的异常,将调用此过滤器。