运行 C# v3 函数应用程序时,我在使用 Application Insights 时遇到一些问题。按照说明,一切都已在 Azure 中设置为使用应用程序见解。在 host.json 文件中,我包含以下设置:
"logging": {
"LogLevel": {
"Default": "Information"
},
"applicationInsights": {
"samplingExcludedTypes": "Request",
"samplingSettings": {
"isEnabled": true
}
}
},
我正在使用依赖注入,因此在应用程序中有一个启动类,然后在需要的地方注入 ILogger 类:
using Microsoft.Extensions.Logging;
...
builder.Services.AddLogging();
在代码中,有几次我会捕获异常、处理它,并希望记录它而不是抛出异常。例如。寻找可能存在或可能不存在的 blob 容器图像 - 我仍然可以返回有效的响应,而不是因为一个简单的问题而抛出整个问题。
但是,Application Insights 似乎没有在跟踪中记录异常,即使它已传递到记录器:
catch (ArgumentException e)
{
var msg = $"Error encountered blah blah blah";
logger.LogWarning(e, msg);
return Result.Failure<string>(msg);
}
我可以在 Application Insights 中看到正在记录的警告以及消息,但跟踪中的消息/自定义维度始终缺少堆栈跟踪。如果我使用 LogError 也会发生同样的情况。
客户:
traces
| where cloud_RoleName == "my-app" and severityLevel == 2
我已经浏览了这里的大量文档和问题,但很难找到有效的答案,或者可以很好地解释正在发生的事情。 Azure Functions + App Insights 似乎非常“如果你打开它,它就会神奇地工作”,或者答案是针对 ASP.NET core,或者只是过时了。
问题是只有应用程序抛出的异常才会显示在 App Insights 的异常区域中并带有堆栈跟踪吗? (如果是这样,您可以在此处记录错误而不引发异常吗?)
我是否缺少 host.json 或启动中的关键配置?图书馆? (我已经尝试添加 Microsoft.Azure.WebJobs.Logging.ApplicationInsights)
如果有必要,我也在考虑改用 Serilog + App Insights 接收器 - 但当它看起来应该“开箱即用”时,我并不特别想这样做。
有人可以帮忙吗?
感谢@PeterBons 的帮助,为了让您记录的异常出现在 App Insights 的异常表中,您需要确保:
如果您使用采样,请将“Exception”添加到 host.json 中的“samplingExcludedTypes”中,以确保它们全部被记录
您需要在项目中引用“Microsoft.Azure.WebJobs.Logging.ApplicationInsights”nuget 包(我保留其他所有内容相同并删除了这个 - 繁荣,没有记录异常)
我也有同样的问题.. 我尝试使用
Microsoft.Azure.WebJobs.Logging.ApplicationInsights
,这会产生一些奇怪的问题,例如 AZFD0005: External startup exception
,因为此 WebJob 会引入对 Function App 组件的一些依赖。
然后我就尝试了**Microsoft.Extensions.Logging.ApplicationInsights**
遵循此处的指南:
https://learn.microsoft.com/en-us/azure/azure-monitor/app/ilogger?tabs=dotnet6
这并没有真正让我得到我想要的东西。
直到我发现了这个:
https://learn.microsoft.com/en-us/azure/azure-monitor/app/opentelemetry-enable?tabs=aspnetcore
安装此软件包
Azure.Monitor.OpenTelemetry.AspNetCore
仅添加这一行:Services.AddOpenTelemetry().UseAzureMonitor();
给了我期望,
我正在记录的所有内容都会显示,EF 正在记录的所有内容也会显示。然后您可以控制严重性级别以在需要时减少日志。