据我所知,TelemetryClient.TrackException可以添加自定义属性。
在添加这些属性之后,您可以在Azure Insights门户中找到相应的值。
有关如何在Web API中添加自定义属性的更多详细信息,请参考以下代码:
public class AiExceptionLogger : ExceptionLogger
{
public override void Log(ExceptionLoggerContext context)
{
if (context != null && context.Exception != null)
{
var ai = new TelemetryClient();
string re = HttpContext.Current.User.Identity.Name;
var properties = new Dictionary<string, string> {{ "Users", "vvvvv" } };
ai.TrackException(context.Exception, properties);
}
base.Log(context);
}
}
您可以在以下的“查看所有属性”中找到它:
但我有另一个问题,我该如何将数据从我的控制器发送到“AiExceptionLogger”呢?例如:我在我的控制器上有一个POST方法Post(user,jobId),我想将jobId添加到TrackException。 注意:我不想为控制器中的每种方法使用try()catch(),如果我可以将这些信息添加到context中,那将是很好的!谢谢!
根据您的描述,我建议您尝试另一种方法,即注册一个过滤器并重写OnActionExecuted方法。
在此方法中,您可以首先检查异常是否为空。如果异常不为空,您可以从HttpActionExecutedContext获取ActionArguments。
然后你可以将这些参数添加到属性中并将它们发送到 Azure 应用程序洞察。
更多详细信息,您可以参考以下代码:
WebApiConfig:
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Filters.Add(new AAA());
}
public class AAA : ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Exception != null)
{
var ai = new TelemetryClient();
string d1 = (string)actionExecutedContext.ActionContext.ActionArguments["id"];
var properties = new Dictionary<string, string> { { "Users", d1 } };
ai.TrackException(actionExecutedContext.Exception, properties);
}
base.OnActionExecuted(actionExecutedContext);
}
}
结果:
TelemetryInitializers
的信息,请参见 https://learn.microsoft.com/en-us/azure/application-insights/app-insights-api-filtering-sampling#add-properties-itelemetryinitializer。您可以向所有请求、异常等项添加自定义属性。但注入正确的值则需要由您来完成。您可以创建一个工厂类,为您的JobId
等信息提供注入方法,具体取决于您如何访问这些信息。 - Peter Bons