![](/img/trans.png)
[英]Using Static Instance of TelemetryClient with Application Insights
[英]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.