带有通用主机和Serilog .NET 7的Sentry

eufgjt7s  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(146)

这是一个一般性的问题。
我真的花了一整天的时间来弄清楚,但没有任何成功。是否有任何地方的例子,或者可以用Sentry来完成,或者我们必须将我们的日志订阅改为另一个?我尝试了基于我在WEB上找到的示例的一切。不幸的是,没有示例代码如何使用Sentry与Serilog以及通用主机(托管服务),而Sentry从appsettings.json读取其配置。
编辑:我找到了一个解决方案,虽然它不是我喜欢的。我想使用appsettings.json配置:

{
  "Sentry": {
    "Dsn": "<dsn>",
    "MinimumBreadcrumbLevel": "Debug",
    "MinimumEventLevel": "Debug"
  },
  "Serilog": {
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
    "MinimumLevel": {
      "Default": "Verbose",
      "Override": {
        "Microsoft": "Information",
        "System": "Warning",
        "Sentry": "Information"
      }
    },
    "WriteTo": [
      {
        "Name": "Console",
        "Args": {
          "formatter": {
            "type": "Serilog.Templates.ExpressionTemplate, Serilog.Expressions",
            "template": "[{@t:HH:mm:ss} {@l:u3}{#if SN is not null} {SN}{#end}] {@m}\n{@x}",
            "theme": "Serilog.Templates.Themes.TemplateTheme::Code, Serilog.Expressions"
          }
        }
      },
      {
        "Name": "File",
        "Args": {
          "path": "Logs\\Service.log",
          "rollOnFileSizeLimit": true,
          "formatter": {
            "type": "Serilog.Templates.ExpressionTemplate, Serilog.Expressions",
            "template": "[{@t:HH:mm:ss} {@l:u3}{#if SN is not null} {SN}{#end}] {@m}\n{@x}"
          }
        }
      },
      {
        "Name": "Sentry",
        "Args": {
          "MinimumBreadcrumbLevel": "Debug",
          "MinimumEventLevel": "Warning"
        }
      }
    ],
    "Enrich": [ "FromLogContext" ]
  }
}

字符串
日志记录配置:

var builder = Host.CreateDefaultBuilder(args);
builder.UseSerilog((context, services, loggerConfiguration) => loggerConfiguration.ReadFrom.Configuration(context.Configuration));
builder.UseSentry();


上面使用的扩展方法是:

public static IHostBuilder UseSentry(this IHostBuilder builder) =>
      builder.ConfigureLogging((context, logging) =>
      {
          var section = context.Configuration.GetRequiredSection("Sentry");
          logging.Services.Configure<SentryLoggingOptions>(section);
          logging.AddSentry();
      });


问题是Sentry.Serilog没有使用在扩展方法中读取的Sentry配置部分。
现在的解决方案:
1.将所有Sentry设置添加到Serilog部分的Sentry部分,并删除根Sentry配置。
1.删除builder. sentry(),这样我就不能使用扩展方法,这是一个缺点,如果我想添加特定的设置哨兵。
最好是使用一个独立的Sentry部分,在那里可以为不同的环境应用程序设置配置公共设置,但我不知道如何做到这一点。此外,我必须找到一种方法来设置Sentry选项,例如服务器名称,并在启动时动态设置环境。

kuuvgm7e

kuuvgm7e1#

在repo上有一个示例:https://github.com/getsentry/sentry-dotnet/blob/main/samples/Sentry.Samples.Serilog/Program.cs
但你也可以看看nuget的趋势:
https://github.com/dotnet/nuget-trends/blob/main/src/NuGetTrends.Scheduler/Program.cs
在这里,我在任何框架代码之前设置serilog,这样如果启动时出现崩溃,它也会捕捉到
编辑:基于您的评论,不需要WebHost:
如果您没有WebHost,则不需要Sentry.AspNetCore,因为这会添加两个中间件,用于在根目录捕获错误,并在请求头中出现trace-id时继续跟踪。它还会自动添加Sentry.Extensions.Logging,但您可以直接将其添加到应用程序中。
下面是一些直接添加到LoggerFactory的示例:https://github.com/getsentry/sentry-dotnet/blob/main/samples/Sentry.Samples.ME.Logging/Program.cs
如果你要将Serilog添加到应用程序中,你还需要Sentry.Serilog(例如如何添加原始消息)。这是因为Serilog接管了日志后端。它可能只适用于Serilog包,我还没有尝试过。
您可能需要阅读.NET IConfiguration内容并将其传递给代码
编辑2:在您的最后一个问题更新解决方案后
问题是Sentry.Serilog没有使用在扩展方法中读取的Sentry配置部分。
Sentry不能,真的。除非你手动绑定那部分配置。但是你在这里使用了两个独立的软件包,它们默认有自己的配置部分。
Sentry应该尽早初始化一次。在你必须做出选择的情况下,这就成了一个问题:通过Serilog配置初始化(因此在Serilog配置部分下),或者通过顶级的Sentry配置,Sentry.Extensions.Logging可以用一两行代码绑定,甚至在任何之前调用SentrySdk.Init,确保如果应用程序崩溃,甚至读取数据或任何东西,哨兵会让你知道。权衡当然是不太灵活的阅读配置从json等,但哨兵确实有内置的支持一些环境变量,所以你可以设置例如SENTRY_DSNSENTRY_ENVIRONMENTSENTRY_RELEASE
Sentry的Serilog部分只能接受你设置的两个值,因为这是唯一一个“Serilog特定”的东西。DSN可以设置为根元素,所以Sentry.Extension.Logging,这样就可以初始化SDK。看起来这就是你已经在做的事情。
此外,我必须找到一种方法来设置哨兵选项,如服务器名称,和环境动态启动。
你可以通过env var设置一些选项,就像我上面提到的那样。服务器名称是从Environment.MachineName自动读取的。你可以用以下命令来修改所有这些:
AddSentry(o => o.ServerName)等。如果你想通过env var或json定义,你可以从.NET的内置配置系统中选择要分配的值。
Sentry将把配置值与您显式传递的回调合并

相关问题