.net core Azure功能将Serilog与应用程序洞察集成,日志在搜索中可见,但不会出现在故障事件时间线中
我正在尝试将Serilog与Application Insights sink一起用于日志记录目的。我可以在Azure Portal(Application Insights)的搜索栏中看到日志,但如果我们在Failures或Performance选项卡中查看事件的时间线,则无法看到相同的日志。谢谢 下面是am用于在FunctionStartup中注册记录器的代码,该代码随后被注入函数以进行日志记录:.net core Azure功能将Serilog与应用程序洞察集成,日志在搜索中可见,但不会出现在故障事件时间线中,.net-core,azure-functions,azure-application-insights,serilog,.net Core,Azure Functions,Azure Application Insights,Serilog,我正在尝试将Serilog与Application Insights sink一起用于日志记录目的。我可以在Azure Portal(Application Insights)的搜索栏中看到日志,但如果我们在Failures或Performance选项卡中查看事件的时间线,则无法看到相同的日志。谢谢 下面是am用于在FunctionStartup中注册记录器的代码,该代码随后被注入函数以进行日志记录: var logger = new LoggerConfiguration()
var logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.Enrich.WithProperty("ApplicationName", "testApp")
.Enrich.WithProperty("Environment", "Dev")
.WriteTo.ApplicationInsights(GetTelemetryClient("Instrumentationkey"), TelemetryConverter.Traces)
.CreateLogger();
builder.Services.AddSingleton<ILogger>(logger);
public static TelemetryClient GetTelemetryClient(string key)
{
var teleConfig = new TelemetryConfiguration { InstrumentationKey = key };
var teleClient = new TelemetryClient(teleConfig);
return teleClient;
}
host.json
{
"version": "2.0",
"logging": {
"applicationInsights": {
"samplingExcludedTypes": "Request",
"samplingSettings": {
"isEnabled": true
}
}
}
}
我知道你的意思了,请允许我在这里总结一下我的测试结果 首先,不是为了提供用于跟踪细节(异常发生之前发生了什么)的时间线,而是为了显示所有异常、错误发生的频率、受影响的用户数量等,它更可能站在较高的位置来查看整个程序 为了实现您的目标,我认为您可以在
日志
刀片中使用这个kql查询,或者在事务刀片中查看它
union traces, requests,exceptions
| where operation_Id == "178845c426975d4eb96ba5f7b5f376e1"
基本上,我们可以在执行链中添加许多日志,例如,在控制器中,记录输入参数,然后记录数据合并或格式化的结果,在catch
中记录异常信息,因此下面是我的测试代码。我无法像您一样在failure blade中看到任何其他信息,但在transaction blade中,我可以看到时间线
public class HelloController : Controller
{
public string greet(string name)
{
Log.Verbose("come to greet function");
Log.Debug("serilog_debug_info");
Log.Information("greet name input " + name);
int count = int.Parse(name);
Log.Warning("enter greet name is : {0}", count);
return "hello " + name;
}
}
我们可以很容易地发现,整个链共享相同的操作ID
,通过所有这些日志,我们可以找出错误的行代码。顺便说一句,如果我用try/catch来包围代码,异常将不会被捕获到故障刀片中
==================================
使用时,我们需要将serilog发送到application insights,并且我们将在事务搜索中看到大量的跟踪
,因此最好将最小级别
设置为信息和更高级别。下面的sreenshot是我的日志详细信息,我们还可以使用operationId的kql查询查看整个链
您可以通过遵循Azure Application Insights在其GitHub repo上提供的解决方案轻松解决此问题,因此,您可以使用DI配置
遥测配置
,即
services.Configure<TelemetryConfiguration>(
(o) => {
o.InstrumentationKey = "123";
o.TelemetryInitializers.Add(new OperationCorrelationTelemetryInitializer());
});
因此,在您的代码中,您必须从
public static TelemetryClient GetTelemetryClient(string key)
{
var teleConfig = new TelemetryConfiguration { InstrumentationKey = key };
var teleClient = new TelemetryClient(teleConfig);
return teleClient;
}
对此
public static TelemetryClient GetTelemetryClient(string key)
{
var teleConfig = TelemetryConfiguration.CreateDefault();
var teleClient = new TelemetryClient(teleConfig);
return teleClient;
}
为了使用上面回答中提到的Azure函数的遥测配置进行日志记录,我们只需要按照下面的代码片段更新函数,并且在部署时它应该自己获取检测密钥
public static TelemetryClient GetTelemetryClient()
{
var teleConfig = TelemetryConfiguration.CreateDefault();
var teleClient = new TelemetryClient(teleConfig);
return teleClient;
}
但在Azure上本地运行和部署后运行。我们需要在函数启动中添加类似的内容,并去掉上面的函数
builder.Services.Configure<TelemetryConfiguration>((o) =>
{
o.InstrumentationKey = "KEY";
o.TelemetryInitializers.Add(new OperationCorrelationTelemetryInitializer());
});
builder.Services.AddSingleton<ILogger>(sp =>
{
var logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.Enrich.WithProperty("ApplicationName", "TEST")
.Enrich.WithProperty("Environment", "DEV")
.WriteTo.ApplicationInsights(
sp.GetRequiredService<TelemetryConfiguration>(), TelemetryConverter.Traces).CreateLogger();
return logger;
});
WriteTo.ApplicationInsights(…,elemetryConverter.Traces),这意味着日志都将写入跟踪,因此您肯定看不到故障。是的,日志正在进入跟踪,但在故障时间线中不可见故障时间线是什么?application insights中的故障刀片?是的,故障刀片还显示了日志的时间线/遥测,其中包含这些自定义跟踪和其他异常。根据我的测试,在我将WriteTo.ApplicationInsights设置为“”并且我的应用程序遇到异常后,application insights可以以这种格式捕获它。你指的是时间表吗?请尝试将Serilog与上述代码中的应用程序细节集成,然后尝试日志信息,好吗?同样在信息方面,我过去常常看到所有的日志,不管是自定义的还是非自定义的。但是Azure或.NET中更新的某些内容可能没有在blade中显示信息,而不仅仅是在我这边测试的事务中,我可以在使用serilog时看到更多日志信息,但它们仍然包含整个执行链。您能否在代码中共享将Serilog与应用程序洞察集成在一起的代码片段?你的host.json中还有什么东西吗?根据我的测试,这是真的,AppInsights无法跟踪函数中的跟踪。这好像是一只虫子,看到了吗
builder.Services.Configure<TelemetryConfiguration>((o) =>
{
o.InstrumentationKey = "KEY";
o.TelemetryInitializers.Add(new OperationCorrelationTelemetryInitializer());
});
builder.Services.AddSingleton<ILogger>(sp =>
{
var logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.Enrich.WithProperty("ApplicationName", "TEST")
.Enrich.WithProperty("Environment", "DEV")
.WriteTo.ApplicationInsights(
sp.GetRequiredService<TelemetryConfiguration>(), TelemetryConverter.Traces).CreateLogger();
return logger;
});
public class Test{
public ILogger _log;
public void Test(ILogger log){
_log=log;
}
}