我正在使用 HostBuilder 在 Program.cs 中配置控制台应用程序。
在
ConfigureServices
:
services.AddSingleton<ITelemetryInitializer, CustomInitializer>(p => new CustomInitializer("my app", Guid.NewGuid().ToString()));
services.AddApplicationInsightsTelemetryWorkerService();
在
ConfigureLogging
:
logging.ClearProviders();
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddNLog(NLog.LogManager.LoadConfiguration("nlog.config").Configuration);
logging.AddApplicationInsights();
在
CustomInitializer.cs
:
class CustomInitializer : ITelemetryInitializer
{
private readonly string _roleName;
private readonly string _roleInstance;
public CloudRoleNameInitializer(string name, string instance)
{
_roleName = name;
_roleInstance = instance;
}
public void Initialize(ITelemetry telemetry)
{
telemetry.Context.Cloud.RoleName = _roleName;
telemetry.Context.Cloud.RoleInstance = _roleInstance;
}
}
如你所见,我也在使用 nlog。当我记录消息时,我可以看到云角色名称未设置为“我的应用程序”,而是设置为我的计算机名称。我在
ConfigureServices
部分尝试了几种可能性:
services.Configure<TelemetryConfiguration>((config) =>
{
config.TelemetryInitializers.Add(new CustomInitializer("my app", Guid.NewGuid().ToString()));
});
这不起作用。
TelemetryConfiguration.Active.TelemetryInitializers.Add(new CustomInitializer("my app", Guid.NewGuid().ToString()));
这工作得很好,但我不断收到 IDE 警告,说这在 .net core 中已经过时了
我检查了所有文档,没有任何内容可以让我对使用
TelemetryConfiguration.Active
的替代品有一个好主意。似乎大多数示例都是针对 .net core Web 应用程序而不是控制台。
NLog 似乎使用 TelemetryConfiguration.Active 来创建 TelemetryClient,因此所有 ITelemetryInitializer 都将被忽略。
我的解决方案是为应用程序洞察添加以下设置
"ApplicationInsights": {
"ConnectionString": "xxx",
"EnableActiveTelemetryConfigurationSetup": true
},
EnableActiveTelemetryConfigurationSetup == true 似乎会自动将遥测设置从 ServiceCollection 传播到 TelemetryConfiguration.Active。