gpt4 book ai didi

c# - 在控制台应用程序中使用 Serilog 和 ApplicationInsights 时,从不调用 ITelemetryInitializer.Initialize

转载 作者:行者123 更新时间:2023-12-03 21:45:05 25 4
gpt4 key购买 nike

我在 .NET Core 3.1 控制台应用程序中配置 DI,如下所示:

services.AddSingleton<ITelemetryInitializer, TelemetryInitializer>();
services.AddApplicationInsightsTelemetryWorkerService(instrumentationKey);
appSettings.json我有:
"Serilog": {
"Using": [
"Serilog.Sinks.Console",
"Serilog.Sinks.ApplicationInsights"
],
"MinimumLevel": "Information",
"WriteTo": [
{
"Name": "Console",
"Args": {
"outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} {Properties:j}{NewLine}{Exception}",
"formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact"
}
},
{
"Name": "ApplicationInsights",
"Args": {
"restrictedToMinimumLevel": "Information",
"InstrumentationKey": "...",
"telemetryConverter": "Serilog.Sinks.ApplicationInsights.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter, Serilog.Sinks.ApplicationInsights",
"outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} {Properties:j}{NewLine}{Exception}",
"formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact"
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]
}
Serilog 配置如下:
Host.CreateDefaultBuilder(args)
.UseSerilog((hostingContext, loggerConfiguration) =>
loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration)
)
.UseConsoleLifetime()
.Build()
.Run()
我的初始化程序类:
public class TelemetryInitializer : ITelemetryInitializer
{
public void Initialize(ITelemetry telemetry)
{
telemetry.Context.Cloud.RoleName = "something-something";
}
}
Initialize但是,当我使用 ILogger 登录时没有调用方法.如果我解决 TelemetryClient直接使用它记录, Initialize叫做。
我是否缺少 Serilog 的一些配置?

最佳答案

似乎是 Serilog.Sinks.ApplicationInsights 的故障.从配置( code reference )初始化接收器时,它会创建一个新的 TelemetryClient这会导致事件 TelemetryConfiguration注册前TelemetryInitializer可能与它有关。
获取 TelemetryInitilizer注入(inject) Active 配置,它需要有 TelemetryClient在 Serilog 初始化 App Insights 接收器之前创建一次的实例。否则为时已​​晚,因为内部 AddApplicationInsightsTelemetryWorkerService寄存器 TelemetryClient作为辛格尔顿。所以下面是我的工作代码,它只是对 TelemetryClient 进行虚拟解析在初始化 Serilog 的 loggerConfiguration 之前。

public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddApplicationInsightsTelemetryWorkerService(instrumentationKey);
services.AddSingleton<ITelemetryInitializer, TelemetryInitializer>();
services.AddHostedService<Worker>();
})
.UseSerilog((hostingContext, serviceProvider, loggerConfiguration) => {
serviceProvider.GetRequiredService<TelemetryClient>(); // just a dummy resolve
loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration);
})
.UseConsoleLifetime();
}
选项 2 是创建一个自定义 TelemetryConverter,它可以更新所需的上下文,而不是使用 Serilog.Sinks.ApplicationInsights.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter .这将消除对初始化程序的依赖。
选项 3 是切换到基于代码的设置,而不是允许您通过 TelemetryClient 的配置。或 TelemetryConfigurationhttps://github.com/serilog/serilog-sinks-applicationinsights#configuring 这样的实例.但这可能不像基于配置的方法那样具有声明性。

关于c# - 在控制台应用程序中使用 Serilog 和 ApplicationInsights 时,从不调用 ITelemetryInitializer.Initialize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64869536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com