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

2023-11-25

我正在测试 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 到达这里?

我不喜欢或不确定这种方法的事情:

  1. 不喜欢从 http 上下文中提取 DI
  2. 关于引发错误的控制器没有太多上下文(也许我可以通过某种方式从上下文中获取它)。

我能想到的另一个选择是有一个基本控制器,它接受所有控制器继承的 ILoggerFactory。

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


你的问题有两部分。 1) DI 可注入过滤器 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那已经过去了。

关于#2:从你之前的帖子看来你正在玩ExceptionHandlerMiddleware(source & 扩展源)...使用它怎么样?...有关它的一些信息:

  • 该中间件是通用的,适用于任何中间件 是在它之后注册的,因此任何像控制器/操作这样的概念 info 是特定于 MVC 的,中间件不会意识到这一点。
  • 该中间件不处理格式化程序写入异常。你可以 编写自己的缓冲中间件,您可以在其中修改响应 body 是一个缓冲流(MemoryStream)并让 MVC 层 写下对此的回应。在格式化程序写入异常的情况下, 您可以捕获它并发送包含详细信息的 500 错误响应。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.Net MVC 6 中的全局错误日志记录 的相关文章

随机推荐

  • 用于单独 HTML 页面的 GWT 多模块?

    我对 GWT 很陌生 打算使用 GWT 开发用户管理应用程序的 UI 我计划使用使用 Spring Hibernate 创建的现有模块 我想出了如何将 GWT 与 Spring 集成 但我不知道如何设计布局 我想要两页 用户注册页面 想要在
  • 发生验证错误时 Symfony2 表单字段未更新

    这是我的表单类型 class TestFormType extends AbstractType public function buildForm FormBuilderInterface builder array options bu
  • 插入排序比冒泡排序更好?

    我正在为考试做复习 想知道在相同的平均情况复杂度为 O N 2 的情况下 插入排序比冒泡排序表现更好 我确实找到了一些相关文章 但我无法理解它们 有人介意用简单的方式解释一下吗 冒泡排序的优点在于检测已排序列表的速度 冒泡排序最佳案例场景
  • shapefile 和 matplotlib:绘制 shapefile 坐标的多边形集合

    我正在尝试使用 python 中的 matplotlib 在世界地图上绘制国家 地区的填充多边形 I ve got a shapefile with country boundary coordinates of every country
  • ListView 和带有倒计时器的项目

    我的 Listview 有问题 我想为所有 ListView 的项目设置一个倒计时器 并且我已经在 google 上搜索了解决方案 但它无法正常工作 问题是 ListView 重用 回收 视图 并且我总是得到错误的项目时间 我在视图中使用了
  • 使用 JAXB 2.1 将多个模式编译到不同的包中

    我有一个 CommonTypes xsd 我使用 xs include 将其包含在我的所有其他 XSD 中 我明白了 Multiple
  • 蓝鸟中的嵌套承诺

    我试图弄清楚如何在蓝鸟库中正确使用承诺 我在代码中遇到了一些嵌套的承诺 我注意到在 bluebird 文档中它写道 如果您使用完整的 bluebird API 产品 您几乎永远不需要首先求助于嵌套承诺 还有许多其他关于承诺被滥用的博客文章嵌
  • 用于 SMS 的 ContentObserver [重复]

    这个问题在这里已经有答案了 我正在尝试提取发送的短信 我知道没有用于此目的的 BroadcastReciver 所以我发现我可以使用 ContentObserver 来监听数据库中的更改 我怎样才能实现这个 我的目标是仅获取发送的新短信并通
  • 两个相同的字符串不相等(不是指针/引用错误)

    我从文件中读取了一行 KatalogObrazk w 1 32 意味着我应该在以下位置查找数据 C Users NAME OF THE USER KatalogObrazk w 所以我就这么做了 但可怕的事情正在发生 在splitLine
  • WPF:即使显式设置 WindowState,窗口仍保持最小化

    我的应用程序有一个托盘图标 双击该图标可隐藏或显示应用程序窗口 我的问题是 如果窗口隐藏时处于最小化状态 我似乎无法将窗口带到前台 例如 假设用户最小化应用程序 然后双击托盘图标 然后应用程序窗口将隐藏并从任务栏中消失 当用户再次双击托盘图
  • GenyMotion 虚拟设备打开并立即消失

    我下载了带有虚拟 VM 包的 GenyMotion Android 模拟器 一切都很顺利 直到虚拟设备下载过程为止 虚拟设备已成功下载 但当我尝试通过点击播放按钮运行虚拟设备时 会弹出一个小窗口 显示正在初始化虚拟设备 然后启动虚拟设备 几
  • 如何仅在触发特定活动后启动 FCM ID 服务?

    假设我有一个LoginActivity用户可以在其中使用现有凭据注册或登录 我不想要FirebaseInstanceIdService生成令牌 除非用户已登录并且MainActivity应用程序的启动 谢谢 你无法阻止FirebaseIns
  • Mockito 间谍 - 调用内部类方法而不是监视间谍对象中的方法时

    我的内部类如下 public class ClassWithInnerObject private final InnerObject innerObject public ClassWithInnerObject innerObject
  • 获取shell中程序的执行时间

    我想在几个不同的条件下在linux shell 中执行某些操作 并且能够输出每次执行的执行时间 我知道我可以编写一个 perl 或 python 脚本来执行此操作 但是有没有办法在 shell 中执行此操作 恰好是 bash 使用内置的ti
  • 标准库容器和不完整类型的规则是什么?

    给定一个不完整的类型 struct S 那么以下声明是 S p ok pointer to incomplete types is allowed std deque
  • 将 Word 转换为 HTML,然后在网页上呈现 HTML

    我的项目正在进行中 但我不知道从哪里开始 我的老板希望能够以 HTML 格式显示 Word 文档 并且它看起来与 Word 文档相同 在一次又一次尝试让我在弹出窗口或灯箱中显示 Word 文档后 他一直坚持剥离 Word 的内容 将其转换为
  • 如何在boost log 2.0中记录编码器的行数?

    我可以为此使用 LineID 属性吗 我希望我可以使用 sink set formatter 来执行此操作而不是使用 LINE and FILE 在每个日志语句中 我为此苦苦挣扎 直到我发现这个片段 define LFC1 LOG TRAC
  • Swiftui [BUG] 导航视图和列表仅在 iPad 模拟器上不显示

    各种iPad模拟器上的空白页 前往Apple开发者网站下载以下教程项目 https developer apple com tutorials swiftui building lists and navigation 在任何 iPad 模
  • 在支持应用程序的模式下在 Mobile Safari 中使用 mailto: 链接时出错

    我在网页中有一个表单 其操作为 mailto email 其中电子邮件是真实的电子邮件地址 当我在 Mobile Safari 中以常规模式加载此页面时 即 不是在支持应用程序的模式下从主屏幕启动 效果很好 在我提交表单后 电子邮件应用程序
  • ASP.Net MVC 6 中的全局错误日志记录

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