Application Insights-loggning med .NET

I den här artikeln lär du dig att samla in loggar med Application Insights i .NET-appar med hjälp Microsoft.Extensions.Logging.ApplicationInsights av providerpaketet. Om du använder den här providern kan du fråga och analysera dina loggar med hjälp av Application Insights-verktygen.

Kommentar

Följande dokumentation förlitar sig på det klassiska API:et Application Insights. Den långsiktiga planen för Application Insights är att samla in data med OpenTelemetry. Mer information finns i Aktivera Azure Monitor OpenTelemetry för .NET-, Node.js-, Python- och Java-program.

Kommentar

Om du vill implementera hela utbudet av Application Insights-telemetri tillsammans med loggning kan du läsa Konfigurera Application Insights för dina ASP.NET webbplatser eller Application Insights för ASP.NET Core-program.

Dricks

Microsoft.ApplicationInsights.WorkerService NuGet-paketet, som används för att aktivera Application Insights för bakgrundstjänster, ligger utanför omfånget. Mer information finns i Application Insights för Worker Service-appar.

ASP.NET Core-program

Så här lägger du till Application Insights-loggning i ASP.NET Core-program:

  1. Microsoft.Extensions.Logging.ApplicationInsightsInstallera .

  2. Lägg till ApplicationInsightsLoggerProvider:

using Microsoft.Extensions.Logging.ApplicationInsights;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Logging.AddApplicationInsights(
        configureTelemetryConfiguration: (config) => 
            config.ConnectionString = builder.Configuration.GetConnectionString("APPLICATIONINSIGHTS_CONNECTION_STRING"),
            configureApplicationInsightsLoggerOptions: (options) => { }
    );

builder.Logging.AddFilter<ApplicationInsightsLoggerProvider>("your-category", LogLevel.Trace);

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

När NuGet-paketet är installerat och providern registreras med beroendeinmatning är appen redo att loggas. Med konstruktorinmatning krävs antingen ILogger eller det generiska alternativet ILogger<TCategoryName> . När de här implementeringarna har lösts tillhandahåller ApplicationInsightsLoggerProvider du dem. Loggade meddelanden eller undantag skickas till Application Insights.

Tänk på följande exempelkontrollant:

public class ValuesController : ControllerBase
{
    private readonly ILogger _logger;

    public ValuesController(ILogger<ValuesController> logger)
    {
        _logger = logger;
    }

    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        _logger.LogWarning("An example of a Warning trace..");
        _logger.LogError("An example of an Error level message");

        return new string[] { "value1", "value2" };
    }
}

Mer information finns i Logga in ASP.NET Core och Vilken Application Insights-telemetrityp skapas från ILogger-loggar? Var kan jag se ILogger-loggar i Application Insights?.

Konsolprogram

Om du vill lägga till Application Insights-loggning i konsolprogram installerar du först följande NuGet-paket:

I följande exempel används paketet Microsoft.Extensions.Logging.ApplicationInsights och visar standardbeteendet för ett konsolprogram. Microsoft.Extensions.Logging.ApplicationInsights-paketet bör användas i ett konsolprogram eller när du vill ha en minimal implementering av Application Insights utan den fullständiga funktionsuppsättningen, till exempel mått, distribuerad spårning, sampling och telemetriinitierare.

using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

using var channel = new InMemoryChannel();

try
{
    IServiceCollection services = new ServiceCollection();
    services.Configure<TelemetryConfiguration>(config => config.TelemetryChannel = channel);
    services.AddLogging(builder =>
    {
        // Only Application Insights is registered as a logger provider
        builder.AddApplicationInsights(
            configureTelemetryConfiguration: (config) => config.ConnectionString = "<YourConnectionString>",
            configureApplicationInsightsLoggerOptions: (options) => { }
        );
    });

    IServiceProvider serviceProvider = services.BuildServiceProvider();
    ILogger<Program> logger = serviceProvider.GetRequiredService<ILogger<Program>>();

    logger.LogInformation("Logger is working...");
}
finally
{
    // Explicitly call Flush() followed by Delay, as required in console apps.
    // This ensures that even if the application terminates, telemetry is sent to the back end.
    channel.Flush();

    await Task.Delay(TimeSpan.FromMilliseconds(1000));
}

Mer information finns i Vilken Application Insights-telemetrityp skapas från ILogger-loggar? Var kan jag se ILogger-loggar i Application Insights?.

Loggningsomfång

ApplicationInsightsLoggingProvider stöder loggomfattningar. Omfång är aktiverade som standard.

Om omfånget är av typen IReadOnlyCollection<KeyValuePair<string,object>>läggs varje nyckel/värde-par i samlingen till i Application Insights-telemetrin som anpassade egenskaper. I följande exempel registreras loggar som TraceTelemetry och har ("MyKey", "MyValue") i egenskaper.

using (_logger.BeginScope(new Dictionary<string, object> { ["MyKey"] = "MyValue" }))
{
    _logger.LogError("An example of an Error level message");
}

Om någon annan typ används som omfång lagras den under egenskapen Scope i Application Insights-telemetri. I följande exempel TraceTelemetry har en egenskap som heter Scope som innehåller omfånget.

    using (_logger.BeginScope("hello scope"))
    {
        _logger.LogError("An example of an Error level message");
    }

Vanliga frågor och svar

Vilken Application Insights-telemetrityp skapas från ILogger-loggar? Var kan jag se ILogger-loggar i Application Insights?

ApplicationInsightsLoggerProviderILogger registrerar loggar och skapar TraceTelemetry från dem. Om ett Exception objekt skickas till -metoden på ILoggerLogExceptionTelemetry skapas i stället för .TraceTelemetry

Visa ILogger-telemetri

I Azure-portalen:

  1. Gå till Azure-portalen och få åtkomst till din Application Insights-resurs.
  2. Klicka på avsnittet "Loggar" i Application Insights.
  3. Använd Kusto-frågespråk (KQL) för att köra frågor mot ILogger-meddelanden, som vanligtvis lagras i traces tabellen.
    • Exempelfråga: traces | where message contains "YourSearchTerm".
  4. Förfina dina frågor för att filtrera ILogger-data efter allvarlighetsgrad, tidsintervall eller specifikt meddelandeinnehåll.

I Visual Studio (lokalt felsökningsprogram):

  1. Starta programmet i felsökningsläge i Visual Studio.
  2. Öppna fönstret Diagnostikverktyg medan programmet körs.
  3. På fliken Händelser visas ILogger-loggar tillsammans med andra telemetridata.
  4. Använd sök- och filterfunktionerna i fönstret Diagnostikverktyg för att hitta specifika ILogger-meddelanden.

Om du föredrar att alltid skicka TraceTelemetryanvänder du det här kodfragmentet:

builder.AddApplicationInsights(
    options => options.TrackExceptionsAsExceptionTelemetry = false);

Varför har vissa ILogger-loggar inte samma egenskaper som andra?

Application Insights samlar in och skickar ILogger loggar med samma TelemetryConfiguration information som används för alla andra telemetrier. Men det finns ett undantag. Som standard TelemetryConfiguration är inte helt konfigurerat när du loggar från Program.cs eller Startup.cs. Loggar från dessa platser har inte standardkonfigurationen, så de kör inte alla TelemetryInitializer instanser och TelemetryProcessor instanser.

Jag använder det fristående paketet Microsoft.Extensions.Logging.ApplicationInsights och vill logga mer anpassad telemetri manuellt. Hur ska jag göra det?

När du använder det fristående paketet TelemetryClient matas du inte in i di-containern (dependency injection). Du måste skapa en ny instans av TelemetryClient och använda samma konfiguration som loggningsprovidern använder, som följande kod visar. Det här kravet säkerställer att samma konfiguration används för all anpassad telemetri och telemetri från ILogger.

public class MyController : ApiController
{
   // This TelemetryClient instance can be used to track additional telemetry through the TrackXXX() API.
   private readonly TelemetryClient _telemetryClient;
   private readonly ILogger _logger;

   public MyController(IOptions<TelemetryConfiguration> options, ILogger<MyController> logger)
   {
        _telemetryClient = new TelemetryClient(options.Value);
        _logger = logger;
   }  
}

Kommentar

Om du använder Microsoft.ApplicationInsights.AspNetCore paketet för att aktivera Application Insights ändrar du den här koden för att komma TelemetryClient direkt i konstruktorn.

Jag har inte installerat SDK och använder Azure Web Apps-tillägget för att aktivera Application Insights för mina ASP.NET Core-program. Hur gör jag för att använda den nya providern?

Application Insights-tillägget i Azure Web Apps använder den nya providern. Du kan ändra filtreringsreglerna i appsettings.json-filen för ditt program.

Nästa steg