我正在开发使用 Microsoft.Extensions.Logging 的 .NET Core 2.2 控制台应用程序,并配置为使用 Microsoft.ApplicationInsights.Extensibility 将日志发送到 Azure Application Insights:
services.AddSingleton(x =>
new TelemetryClient(
new TelemetryConfiguration
{
InstrumentationKey = "xxxx"
}));
...
var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
loggerFactory.AddApplicationInsights(serviceProvider, logLevel);
工作正常:我可以在 Application Insights 中读取日志。但应用程序可以在少数实例中同时启动(在不同的 Docker 容器中)。如何区分来自不同实例的痕迹?我可以使用源文件名,但我不知道应该如何注入(inject)它。
我尝试使用范围:
var logger = loggerFactory.CreateLogger<Worker>();
logger.BeginScope(dto.FileName);
logger.LogInformation($"Start logging.");
有趣的是,我的配置几乎与示例中的相同:https://github.com/MicrosoftDocs/azure-docs/issues/12673
但就我而言,我在 Application Insights 中看不到属性“FileName”。
最佳答案
对于控制台项目,如果要使用自定义 ITelemetryInitializer,应使用以下格式:.TelemetryInitializers.Add(new CustomInitializer())
;
官方文档是here .
我在身边测试了一下,效果很好。可以设置角色名称。
示例代码如下:
static void Main(string[] args)
{
TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault();
configuration.InstrumentationKey = "xxxxx";
configuration.TelemetryInitializers.Add(new CustomInitializer());
var client = new TelemetryClient(configuration);
ServiceCollection services = new ServiceCollection();
services.AddSingleton(x => client);
var provider = services.BuildServiceProvider();
var loggerFactory = new LoggerFactory();
loggerFactory.AddApplicationInsights(provider, LogLevel.Information);
var logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation("a test message 111...");
Console.WriteLine("Hello World!");
Console.ReadLine();
}
检查Azure门户中的角色名称:
关于azure - 如何在 Application Insights 中区分来自不同实例 .net core 应用程序的跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53866258/