簡體   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