繁体   English   中英

如何创建 TelemetryClient 的 static 实例,用于在 Azure 功能中记录应用程序洞察

[英]How to create a static instance of TelemetryClient for application insights logging in Azure Functions

我正在尝试在我的应用程序中实现 appinsights 日志记录,但我无法创建TelemetryClient的实例,因为它在 .net 核心应用程序中已被弃用。 现在我使用下面的方法在 azure 函数中记录数据。

startup.cs文件

public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddApplicationInsightsTelemetry();
        }
    }

在我的Function.cs文件中:

public class Function1
    {

        TelemetryClient _telemetry;
        
        public Function1(TelemetryClient telemetry)
        {
            _telemetry = telemetry;
        }

        [FunctionName("Function1")]
        public  async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log)
        {
            
            // APPINSIGHTS LOG! 
            _telemetry.TrackTrace("Testing the appinsights");
            string name = req.Query["name"];

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            name = name ?? data?.name;

            string responseMessage = "This HTTP triggered function executed successfully.";
            return new OkObjectResult(responseMessage);
        }
    }

使用上面的遥测技术没有任何问题。 我现在的问题是如何在我的整个应用程序中使用此遥测 object,以便我可以在不创建多个实例的情况下访问所有遥测方法。 过去我曾经创建一个TelemetryClient的 singleton 实例并在应用程序中使用它。

例如,我在另一个 class 的构造函数中使用遥测 object 来记录一些数据。

学生.cs文件:

using Microsoft.ApplicationInsights;
private TelemetryClient _telemetryClient;

public Student(TelemetryClient telemetryClient)
    {
        _telemetryClient = telemetryClient;
    }

在方法内部,我正在使用它

_telemetryClient.TrackEvent("We are in SQL Server -> Student.cs File");

我是否需要在我需要记录的所有 class 文件中的构造函数中传递此 object,或者是否有更好的方法来实现此功能。

我是依赖注入和 .net 核心的新手。 请协助。

为什么不使用新方法——ILogger? 您可以将其注入每个 function(如您的代码示例中所示),然后使用它将事件记录到 App Insights。 ILogger 使用方便,如下图所示:

[FunctionName("GetVersion")]
public static async Task<IActionResult> GetVersion(
   [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "instance/version")] HttpRequest req,
   ILogger log, ExecutionContext context)
{
    ServerlessVersionModel ver = new ServerlessVersionModel();
    log.LogInformation("[{funcname}] request made", context.FunctionName);
    try
    {
        ver = GetVersions(context,log);
        return new JsonResult(ver);
    }
    catch (Exception e)
    {
        log.LogError("[{funcname}] exception: {exception}.", context.FunctionName, e.Message);
        return new JsonResult(ver);
    }

}

我试了一天来实现你所描述的。 问题不在于记录到应用程序洞察力。 那正在发生。 如果您在 startup.cs 中注入记录器并在您的 Azure function 中使用它,然后在 Application Insights 中使用 go 并搜索您在程序中登录的文本术语,您将看到它。 问题是您希望看到它出现在监视器日志中。

APPINSIGHTS_INSTRUMENTATIONKEY 已弃用。 MS 说不要使用它。 好的。 他们建议您改为使用 APPLICATIONINSIGHTS_CONNECTION_STRING。 这就是问题所在。 如果您查看此连接字符串,它有一些 inte.net url。 这些 url 与注入到主 Azure function(运行)中的 ILogger 日志使用的不同。 MS 在创建 APPLICATIONINSIGHTS_CONNECTION_STRING 时提供的 url 与普通 ILogger 日志使用的 url 不同。 Go 到 application insights 并查看两个日志的详细信息:一个是使用默认记录器生成的,另一个是使用 startup.cs 中的记录器生成的,两个完全不同的位置位于完全不同的国家(数据中心)。

因此,如果您希望日志出现在门户上 Azure function 的监视器日志中,我想您需要弄清楚运行中的 ILogger 日志使用的连接字符串。 Go图!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM