【问题标题】:How to proper log every exception using OWIN如何使用 OWIN 正确记录每个异常
【发布时间】:2015-01-28 17:49:04
【问题描述】:

我的问题应该很简单,但不幸的是我没有解决它。

基本上,我有一些由 OWIN 托管并部署在 Azure 上的 Web API 控制器。

我确实需要跟踪每个中间件中发生的异常(例如 OAuthAuthorizationServerProviderSignalR Persistent Connections),但我绝对不知道如何去实现它。

  • 我尝试了 Elmah,但由于缺少 HttpContext,它似乎无法与 OWIN 一起正常工作。
  • 我尝试使用 log4net,但我只能使用自定义 ExceptionFilterAttribute 记录由 Web API 控制器引发的异常。其他被忽略。
  • 我尝试定义一个自定义 LoggerFactory 并在 Startup 中分配它,使用 app.SetLoggerFactory(new MyLoggerFactory()), 但其他中间件抛出的异常不会被记录。
  • 我试图至少向客户端发送一条有意义的错误消息,但尽管有<customErrors mode="Off"/><deployment retail="false"/>,Azure 拒绝返回除{"message":"an error has occurred"} 之外的任何内容。我尝试了Azure 网站和Azure 云服务。
  • 我看到了一些 应该 与 OWIN 一起使用的云替代方案,例如 Elmah.io 或 Raygun.io,但我不需要它们的云功能,而且绝对不值得每年支付数百美元只是为了记录一些异常。

记录我的应用程序抛出的任何可能的异常的最佳方法应该是什么?

感谢您的帮助

【问题讨论】:

    标签: azure logging exception-handling owin middleware


    【解决方案1】:

    你看过这个链接吗? http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling

    由于使用 exceptionFilter 无法捕获所有异常,他们建议使用 IExceptionLogger 和 IExceptionHandler 来允许在 Web Api 2 中进行全局错误处理。

    之后,如果它不符合您的需要,您可以构建一个 OwinMiddleWare 并将其放置在第一个位置(在 Authenticate 阶段之前),这个中间件可以:

    1. 在响应的标头中创建一个 requestId
    2. 在发送响应之前分析响应代码,如果它不是 IsSuccessStatusCode,您可以将异常消息记录到数据库并替换响应的内容以使用 requestId 向客户端发送简单的错误消息(允许您可以在您的数据库中找到相关的异常)

    希望有帮助

    【讨论】:

    • 非常感谢您,杰瑞米。那成功了。具体来说,使用 IExceptionHandler 不足以捕获来自所有中间件(包括 OAuth)的异常。但是定义一个新的中间件并在其中处理异常,解决了我的两个问题:记录它们并决定将什么转发给客户端。再次感谢! :)
    • @MenionLeah 我在同一个搜索中使用中间件捕获异常,您有推荐的工具吗?我们在以前的应用程序中使用了 elmah,我们想要类似的东西,谢谢
    • 嗨@Juan;抱歉,我最终使用自己的代码将它们存储在我们的数据库中,并提供了一个网页来访问它们。
    • 好的,谢谢你的时间,我正在寻找他们使用微软的 ilogger 实现的 serilog,查询功能看起来不错。
    • @MenionLeah 我正在努力实现同样的目标,是否可以更新您的答案并分享有关您如何实现此功能的代码 sn-p?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    相关资源
    最近更新 更多