TheWebGuy
TheWebGuy

Reputation: 12615

Application Insights - Logging exceptions

I wrote a custom logger for Application Insights in my app. I don't see any exceptions or ANY events when viewing App Insights in Azure Portal. Here is the logger class code, when I debug the code I do see a key assigned to the InstrumentationKey property, any ideas what I am doing wrong here? Do I need to attach other info to the client or configuration?

public class AppInsightsLogger:ILogger
{
    private TelemetryClient ai;

    public AppInsightsLogger()
    {
        ai = new TelemetryClient();
        if (string.IsNullOrEmpty(ai.InstrumentationKey))
        {
            // attempt to load instrumentation key from app settings
            var appSettingsTiKey = AppSettings.InsightsKey;
            if (!string.IsNullOrEmpty(appSettingsTiKey))
            {
                TelemetryConfiguration.Active.InstrumentationKey = appSettingsTiKey;
                ai.InstrumentationKey = appSettingsTiKey;
            }
            else
            {
                throw new Exception("Could not find instrumentation key for Application Insights");
            }
        }
    }
    public void LogException(Exception ex)
    {
        ai.TrackException(ex);
    }
}

Upvotes: 13

Views: 40326

Answers (3)

nmit026
nmit026

Reputation: 3392

For a version 3 webjob, I tried instantiating a TelemetryClient and calling TrackException(), as well as calling Flush() and waiting up to 180 seconds, but none of that worked. What does work is using the ILogger logger object and passing the exception into LogError().

Upvotes: 1

Alex Klaus
Alex Klaus

Reputation: 8954

Nowadays, the question and the accepted answer are outdated. The contemporary approach is to add Microsoft.ApplicationInsights.AspNet NuGet package, which has logging out-of-the-box.

Please refer to the official docs.

The gist from the docs:

  1. ApplicationInsightsLoggerProvider is enabled by default.
  2. Captured log types can be configured in appsettings.json (or programmatically if you really need it)
    "Logging": {
        "LogLevel": {
            "Default": "Warning"
        },
        "ApplicationInsights": {
            "LogLevel": {
                "Default": "Error"
            }
        }
    }

Upvotes: 8

Alex Bulankou
Alex Bulankou

Reputation: 2456

I created a new Console Application, installed latest stable ApplicationInsights SDK and pretty much kept your example, with minor but important difference - I either let it wait before shutting down after calling TrackException or added TelemetryClient.Flush()

namespace logtest
{
    class Program
    {
        static void Main(string[] args)
        {
            AppInsightsLogger logger = new AppInsightsLogger();
            logger.LogException(new InvalidOperationException("Is data showing?"));

            // either wait for a couple of minutes for the batch to be sent of add ai.Flush() after ai.TrackException() to send the batch immediately
            Console.ReadLine();
        }
    }

    public class AppInsightsLogger
    {
        private TelemetryClient ai;

        public AppInsightsLogger()
        {
            ai = new TelemetryClient();
            if (string.IsNullOrEmpty(ai.InstrumentationKey))
            {
                // attempt to load instrumentation key from app settings
                var appSettingsTiKey = "<ikey>";
                if (!string.IsNullOrEmpty(appSettingsTiKey))
                {
                    TelemetryConfiguration.Active.InstrumentationKey = appSettingsTiKey;
                    ai.InstrumentationKey = appSettingsTiKey;
                }
                else
                {
                    throw new Exception("Could not find instrumentation key for Application Insights");
                }
            }
        }
        public void LogException(Exception ex)
        {
            ai.TrackException(ex);
            // ai.Flush();
        }
    }
}

First I could see telemetry item sent in Visual Studio debug output window: enter image description here

Then I could see telemetry leaving my machine in Fiddler, I also could see it was successfully accepted by our data collection endpoint. enter image description here

And finally I could see it in the portal:

enter image description here

Upvotes: 15

Related Questions