如何拦截Azure WebJob失败/异常

时间:2016-03-10 22:06:09

标签: c# azure azure-webjobs azure-application-insights

目前在Azure中,当WebJob抛出异常时,异常会被JobHost(以某种方式)捕获并处理,然后将异常记录到可通过Web应用程序的Web应用程序刀片中获得的仪表板中托管。有没有办法拦截错误处理或覆盖它,以便我可以插入我的Application Insights实例?

2 个答案:

答案 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(); 
}