我们有一个。net6 web API和worker项目,我们正试图利用Serilog来记录应用程序的见解。
在两个解决方案中都使用的公共类库中存在一个扩展方法:
/// <summary>
/// Extension IHostBuilder method for configuring logging in projects.
/// </summary>
/// <param name="hostBuilder">IHostbuilder.</param>
/// <returns>IHostBuilder.</returns>
public static IHostBuilder ConfigureLogging(this IHostBuilder hostBuilder)
{
hostBuilder.UseSerilog((hostingContext, loggerConfiguration) =>
{
loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration);
});
return hostBuilder;
}
在program.cs文件
中使用var builder = WebApplication.CreateBuilder(args);
builder.Host.ConfigureLogging ();以下包安装在公共库和api库
中<ItemGroup><PackageReference Include="Serilog.AspNetCore" Version="5.0" /> <PackageReference Include="Serilog.Settings.Configuration" Version="3.3.0" /> <PackageReference Include="Serilog.Sinks.ApplicationInsights" Version="3.1.0" /> </ItemGroup>
上述包也安装在API项目中。
我们让它在放置在serilog块中时拾取仪表键。然而,根据他们的指导,这是不鼓励的:https://github.com/serilog-contrib/serilog-sinks-applicationinsights#configuring-with-readfromconfiguration -正如上面提到的,你也可以传递一个仪表键,但这是不鼓励的
我们在appsettings中有以下配置。以API项目中的json为例,当我们引用其中的instrumentation key时,它会工作,如下所示:
{
"Serilog": {
"Using": [
"Serilog.Sinks.ApplicationInsights"
],
"MinimumLevel": {
"Default": "Information",
"Override": {
"System": "Warning"
}
},
"WriteTo": [
{
"Name": "ApplicationInsights",
"Args": {
"instrumentationkey: "<key goes here>",
"telemetryConverter": "Serilog.Sinks.ApplicationInsights.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter, Serilog.Sinks.ApplicationInsights"
}
}
],
"Enrich": [ "FromLogContext" ],
"Properties": {
"Application": "Solution.Api"
}
}
}
我们也可以通过使用环境变量使其工作,通过在launchsettings.json中添加以下内容:
"Solution.Api": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "https://localhost:7194;http://localhost:5194",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"APPINSIGHTS_INSTRUMENTATIONKEY": "<Insert instrumentation key>"
}
},
最终,这两种方法似乎都不正确,我们希望appSettings中的仪表键与serilog配置解耦为最佳实践。这似乎是一个已知的问题,可能与。net6 https://github.com/serilog-contrib/serilog-sinks-applicationinsights/issues/176有关,想知道是否有人知道问题是什么/我们错过了?
我对这个问题的理解是,它围绕着将应用程序洞察力转移到标准服务而不是应用程序构建器管道的一部分。
Serilog,作为app builder管道的一部分,然后尝试从appsettings配置sink。因此(目前)不知道如何在它不拥有的配置对象中查找instrumentation键。
对于你在GitHub问题176的链接中详细说明的问题,我们的工作是使用fluent api配置Application Insights sink
loggerConfiguration.ReadFrom.Configuration(context.Configuration)
.WriteTo.ApplicationInsights(
provider.GetRequiredService<TelemetryConfiguration>(),
TelemetryConverter.Traces);
这个解决方法允许我们使用仪表键(或连接字符串),因为它是根据App Insights文档来使用的。
这确实限制了配置驱动的对跟踪数据级别的控制,这些跟踪数据通过Serilog传递给提供者,但是使用标准的日志提供者配置允许额外的限制在这些日志通过Serilog之后应用于跟踪。由于这是直接应用于日志记录提供程序的后serilog过滤器,因此它只能用于添加限制。它不能用于添加异常。
除了这种方法之外,您已经详细介绍了我所看到的其他两个选项:
- 在Serilog sink配置 中包含instrumentation key
- 使用instrumentation key作为环境变量