目前在Azure中,当WebJob抛出异常时,异常会被JobHost
(以某种方式)捕获并处理,然后将异常记录到可通过Web应用程序的Web应用程序刀片中获得的仪表板中托管。有没有办法拦截错误处理或覆盖它,以便我可以插入我的Application Insights实例?
答案 0 :(得分:6)
您可以使用Azure WebJobs SDK Extensions:有一个ErrorTrigger
,以便您可以用来拦截未处理的例外:
public class UnhandledErrorTrigger : IDisposable
{
private readonly TelemetryClient _telemetryClient;
public UnhandledErrorTrigger(TelemetryClient telemetryClient)
{
_telemetryClient = telemetryClient;
}
public void UnHandledException([ErrorTrigger("0:01:00", 1)] TraceFilter filter, TextWriter log)
{
foreach (var traceEvent in filter.Events)
{
_telemetryClient.TrackException(traceEvent.Exception);
}
// log the last detailed errors to the Dashboard
log.WriteLine(filter.GetDetailedMessage(1));
}
public void Dispose()
{
_telemetryClient.Flush();
}
}
要注册错误扩展,请在启动代码中调用config.UseCore()
:
private static void Main()
{
var config = new JobHostConfiguration();
config.UseCore();
...
new JobHost(config).RunAndBlock();
}
因此,如果您使用的是IoC容器,则可以轻松注入TelemetryClient。要为webjob配置作业激活器,您可以查看以下文章:
答案 1 :(得分:2)
查看一些azure docs here。您可以将处理程序附加到AppDomain
处理未知异常(取自上面的链接):
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
// ...
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
ExceptionTelemetry excTelemetry = new ExceptionTelemetry((Exception)e.ExceptionObject);
excTelemetry.SeverityLevel = SeverityLevel.Critical;
excTelemetry.HandledAt = ExceptionHandledAt.Unhandled;
telemetryClient.TrackException(excTelemetry);
telemetryClient.Flush();
}