我在使用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容器中)同时启动应用程序。如何区分不同实例的痕迹?我可以使用源FileName,但是我不知道如何注入它。
我尝试使用Scope:
var logger = loggerFactory.CreateLogger<Worker>();
logger.BeginScope(dto.FileName);
logger.LogInformation($"Start logging.");
有趣的是,我的配置几乎与示例相同:https://github.com/MicrosoftDocs/azure-docs/issues/12673
但是在我的情况下,我在Application Insights中看不到属性“ FileName”。
答案 0 :(得分:1)
如果您真的无法区分它们,则可以使用custom telemetry initializer,如下所示:
public class CustomInitializer : ITelemetryInitializer
{
public void Initialize(ITelemetry telemetry)
{
telemetry.Context.Cloud.RoleName = Environment.MachineName;
}
}
和/或您可以添加自定义属性:
public class CustomInitializer : ITelemetryInitializer
{
public void Initialize(ITelemetry telemetry)
{
if(telemetry is ISupportProperties)
{
((ISupportProperties)telemetry).Properties["MyIdentifier"] = Environment.MachineName;
}
}
}
在此示例中,我使用了Environment.MachineName
,但是如果需要,您当然可以使用其他东西。就像您的工作ID参数一样。
使用以下方法将其连接起来
services.AddSingleton<ITelemetryInitializer, CustomInitializer>();
答案 1 :(得分:1)
对于控制台项目,如果要使用自定义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门户中检查角色名称: