这是一个一般性的问题。
我真的花了一整天的时间来弄清楚,但没有任何成功。是否有任何地方的例子,或者可以用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选项,例如服务器名称,并在启动时动态设置环境。
1条答案
按热度按时间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_DSN
,SENTRY_ENVIRONMENT
、SENTRY_RELEASE
等Sentry的Serilog部分只能接受你设置的两个值,因为这是唯一一个“Serilog特定”的东西。
DSN
可以设置为根元素,所以Sentry.Extension.Logging,这样就可以初始化SDK。看起来这就是你已经在做的事情。此外,我必须找到一种方法来设置哨兵选项,如服务器名称,和环境动态启动。
你可以通过env var设置一些选项,就像我上面提到的那样。服务器名称是从
Environment.MachineName
自动读取的。你可以用以下命令来修改所有这些:AddSentry(o => o.ServerName)
等。如果你想通过env var或json定义,你可以从.NET的内置配置系统中选择要分配的值。Sentry将把配置值与您显式传递的回调合并