.net core Azure功能将Serilog与应用程序洞察集成,日志在搜索中可见,但不会出现在故障事件时间线中

.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()

我正在尝试将Serilog与Application Insights sink一起用于日志记录目的。我可以在Azure Portal(Application Insights)的搜索栏中看到日志,但如果我们在Failures或Performance选项卡中查看事件的时间线,则无法看到相同的日志。谢谢

下面是am用于在FunctionStartup中注册记录器的代码,该代码随后被注入函数以进行日志记录:

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;
      }
   }