【问题标题】:Web Application not logging errors to Sentry when deployed on Azure App部署在 Azure 应用程序上时,Web 应用程序未将错误记录到 Sentry
【发布时间】:2021-11-04 22:19:41
【问题描述】:

我正在使用 Sentry 免费帐户在我的应用程序中记录错误。日志记录在我的开发环境中运行良好,但是当我在 Azure 上部署应用程序时,错误不会推送到哨兵。我检查了文件日志,并且 Sentry 客户端 CaptureException 方法工作正常并且也返回了一个 SentryId,但是当我在 Sentry.io 上检查时,那里没有记录任何异常。 这是一个asp。净应用。 .Net 框架:4. 6. 1 哨兵客户端版本:3. 9. 0. 0

这是我将异常记录到哨兵的方法:

public void LogException(Exception ex)
        {
            
                try
                {
                    if (ex == null) return;
                    var sentryId = SentrySdk.CaptureException(ex);
                    LogManager.Info(typeof(SentryManager),
                    $"SentrySdk.CaptureException(ex) called successfully. SentryId: {sentryId}");
                }
                catch (Exception e)
                {
                    LogManager.Error(typeof(SentryManager), $"SentryManager Exception - {e.Message + e.InnerException}", null);
                }
        }

我检查了我的 Azure 日志,没有发现与 Sentry 相关的内容。请建议我可以做些什么来调试我的问题, 谢谢。

--编辑--

我能够收到错误消息。我收到此错误:“无法在会话中报告错误,因为没有 active.System.Object[]”

谁能建议如何避免这种情况?

--编辑 2--

捕获的错误: 无法加载文件或程序集‘System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1,

【问题讨论】:

标签: asp.net azure azure-devops azure-web-app-service sentry


【解决方案1】:

首先,我必须找出导致问题的错误。为此,我编写了一个简单的记录器,用于记录 Sentry SDK 生成的消息。 (来源:Sentry Not Logging Errors in WebForms App

public class SentryDiagnosticLogger : IDiagnosticLogger {
    public SentryDiagnosticLogger()
    {
    }

    public bool IsEnabled(SentryLevel level)
    {
        return true;
    }

    public void Log(SentryLevel logLevel, string message, Exception exception = null, params object[] args)
    {
        if (exception != null)
            throw new Exception("Sentry Exception occurred", exception);
    }
}

我的 SDK 初始化代码如下所示:

SentrySdk.Init(o =>
    {
        o.Dsn = config;
        o.Environment = ConfigurationManager.AppSettings["tavrtalk:Environment"];
        o.Debug = true;
        o.DiagnosticLevel = SentryLevel.Debug;
        o.DiagnosticLogger = new SentryDiagnosticLogger();
    });

最后,我得到了错误:

无法加载文件或程序集 System.Runtime.CompilerServices.Unsafe,版本=4.0.4.1

我的项目中有 5.0.0 版本。因此,我在主机应用程序中更新了绑定重定向,并且 Sentry SDK 自动选择了 System.Runtime.CompilerServices.Unsafe 程序集的更新版本。我在 web.config 文件中添加了以下配置:

<dependentAssembly>
    <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="*************" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>

这就是 Sentry 在 dev 上运行良好的原因,因为我的 dev 的 web.config 具有此绑定重定向,但部署的 web.config 没有。

【讨论】:

  • SDK 调用此 Log 方法来传达其中发生的事情。而不是您的应用程序中的例外。像这样抛出异常可能会导致无限循环,因为 SDK 可能会捕获它,然后使用该确切的诊断记录器再次将其注销。我不推荐这个。请在此处查看文档:docs.sentry.io/platforms/dotnet/configuration/diagnostic-logger
  • @BrunoGarcia 我不明白它怎么会是一个无限循环?因为我们已经覆盖了记录器的行为,而不是捕获异常,记录器将抛出异常,然后将在我自己的代码中处理!
  • SDK 本身在诊断记录器上调用 LogError。它在 try 块中执行此操作。该记录器接口用于诊断 SDK 本身的问题。 SDK 可能会从顶部的 try/catch 块中捕获并重新抛出,它会泄漏到您自己的代码中,但这可能会使您的应用程序崩溃
  • @BrunoGarcia 感谢您的指出。我现在知道了。将对此进行更详细的研究。
猜你喜欢
  • 2019-06-09
  • 2019-06-08
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多