Áng*_*ela 4 c# sentry serilog asp.net-core
我正在尝试将应用程序启动期间抛出的错误记录到哨兵。我正在使用 ASP.NET Core 2.1.2、Serilog 和 Sentry。如果我只使用哨兵,它似乎工作正常。
WebHost.CreateDefaultBuilder(args)
.UseSentry("dsn")
.UseStartup<Startup>()
.Build()
.Run();
Run Code Online (Sandbox Code Playgroud)
但是,如果我添加 Serilog,应用程序在启动期间不会发送任何事件,但如果控制器操作抛出异常,它会继续工作。
WebHost.CreateDefaultBuilder(args)
.UseSerilog(
(hostingContext, loggerConfiguration) =>
loggerConfiguration
.Enrich.FromLogContext()
.MinimumLevel.Debug()
.WriteTo.Console()
.WriteTo.Sentry(s => {
s.MinimumBreadcrumbLevel = LogEventLevel.Debug;
s.MinimumEventLevel = LogEventLevel.Error;
}))
.UseSentry("dsn")
.UseStartup<Startup>()
.Build()
.Run();
Run Code Online (Sandbox Code Playgroud)
我正在尝试从Startup 类中的ConfigureServices和方法进行日志记录:Configure
public class Startup
{
public Startup(IConfiguration configuration, ILogger<Startup> logger)
{
Configuration = configuration;
Logger = logger;
}
public IConfiguration Configuration { get; }
public ILogger<Startup> Logger { get; }
public void ConfigureServices(IServiceCollection services)
{
Logger.LogError(new Exception("something went wrong while configuring services"), "ERROR");
services
.AddMvc()
.AddJsonOptions(options =>
{
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
Logger.LogError(new Exception("something went wrong while configuring app"), "ERROR");
}
}
Run Code Online (Sandbox Code Playgroud)
我想这与每个记录器的初始化顺序有关,但我对启动过程的了解还不够,无法提出解决方案或至少给出解释。知道为什么会发生这种情况以及如何解决它吗?
更新
似乎将 DNS 显式添加到 serilog 配置中也可以解决该问题,尽管这似乎与哨兵存储库中的示例不符。
.UseSerilog(
(hostingContext, loggerConfiguration) =>
loggerConfiguration
.Enrich.FromLogContext()
.MinimumLevel.Debug()
.WriteTo.Console()
.WriteTo.Sentry(s => {
s.MinimumBreadcrumbLevel = LogEventLevel.Debug;
s.MinimumEventLevel = LogEventLevel.Error;
s.Dsn = new Dsn(dsn);
}))
Run Code Online (Sandbox Code Playgroud)
ASP.NET Core 日志记录基础结构是在应用程序请求管道之前构建的。因此,我们只能通过日志集成捕获应用程序启动期间发生的异常。
仅 使用时会捕获应用程序初始化错误的原因Sentry.AspNetCore是该包依赖于Sentry.Extensions.Logging.
当您这样做时UseSentry,它会在内部连接到框架日志记录基础设施。类中的崩溃Startup发生在应用程序实际构建之前(完成ConfigureServices并Configure需要启动应用程序),因此只有使用日志记录集成,我们才能捕获此时的错误。
添加Serilog到应用程序后,默认的日志记录后端将被它取代。这意味着对日志基础设施的挂钩Sentry.Extensions.Logging现在已经接管,不再生效Serilog。
因此,您Sentry.Serilog还需要添加该软件包。Serilog在这种情况下,添加两个包后,只有通过集成初始化 SDK(正如您根据上一条评论所做的那样),您才能捕获引导错误。为了避免混淆,示例中没有这样做(为什么我需要提供两次 DSN?),但在幕后发生的情况是,由 Serilog 完成的第一次初始化只有在该过程Startup完成之前才真正有用。初始化后Sentry.AspNetCore,它将关闭集成创建的第一个客户端Serilog并刷新所有事件并将新客户端添加到主范围。这可以确保请求数据之类的内容也被添加到事件中。
| 归档时间: |
|
| 查看次数: |
3822 次 |
| 最近记录: |