[英]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.