gpt4 book ai didi

asp.net - ASP.Net MVC 6 中的全局错误日志记录

转载 作者:行者123 更新时间:2023-12-04 03:37:07 26 4
gpt4 key购买 nike

我正在测试 MVC 6 Web Api 并希望实现登录到全局错误处理程序。只是保证没有错误会在没有被记录的情况下离开系统。我创建了一个 ExceptionFilterAttribute 并在启动时将其全局添加:

public class AppExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
//Notice pulling from HttpContext Application Svcs -- don't like that
var loggerFactory = (ILoggerFactory)context.HttpContext.ApplicationServices.GetService(typeof (ILoggerFactory));

var logger = loggerFactory.Create("MyWeb.Web.Api");
logger.WriteError(2, "Error Occurred", context.Exception);

context.Result = new JsonResult(
new
{
context.Exception.Message,
context.Exception.StackTrace
});
}
}

现在在启动时,我将这个过滤器添加到:
services.Configure<MvcOptions>(options =>
{
options.Filters.Add(new AppExceptionFilterAttribute());
});

这一切似乎都是蛮力……有没有更好的方法可以使用 MVC 6 到达这里?

我不喜欢或不确定这种方法的事情:
  • 不喜欢从 http 上下文中提取 DI
  • 没有太多关于引发错误的 Controller 的上下文(也许我可以通过某种方式从上下文中获取它)。

  • 我能想到的另一个选择是有一个基本 Controller ,它接受所有 Controller 都继承的 ILoggerFactory。

    想知道是否有某种诊断中间件可以插入日志记录...

    最佳答案

    你的问题有两个部分。 1) DI 可注入(inject)过滤器 2) 全局错误处理。

    关于#1:您可以使用ServiceFilterAttribute以此目的。
    例子:

    //Modify your filter to be like this to get the logger factory DI injectable.
    public class AppExceptionFilterAttribute : ExceptionFilterAttribute
    {
    private readonly ILogger _logger;
    public AppExceptionFilterAttribute(ILoggerFactory loggerfactory)
    {
    _logger = loggerFactory.CreateLogger<AppExceptionFilterAttribute>();
    }
    public override void OnException(ExceptionContext context)
    {
    //...
    }
    }
    //Register your filter as a service (Note this filter need not be an attribute as such)
    services.AddTransient<AppExceptionFilterAttribute>();
    //On the controller/action where you want to apply this filter,
    //decorate them like
    [ServiceFilter(typeof(AppExceptionFilterAttribute))]
    public class HomeController : Controller
    {
    ....
    }

    您应该能够从 ExceptionContext 获取 Controller 的详细信息。即通过。

    关于#2:从你之前的帖子看来你在玩 ExceptionHandlerMiddleware ( source & extension source )...使用它怎么样?...有关它的一些信息:
  • 这个中间件是通用的,适用于任何中间件
    在它之后注册,因此任何概念,如 Controller / Action
    info 特定于 MVC,该中间件不会知道。
  • 此中间件不处理格式化程序写入异常。你可以
    编写您自己的缓冲中间件,您可以在其中修改响应
    body 是一个缓冲流(MemoryStream)并让 MVC 层
    写下对它的回应。在格式化程序写入异常的情况下,
    您可以捕获它并发送带有详细信息的 500 错误响应。
  • 关于asp.net - ASP.Net MVC 6 中的全局错误日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28967183/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com