Protokolování Přehledy aplikací pomocí .NET

V tomto článku se dozvíte, jak zaznamenávat protokoly pomocí aplikačních Přehledy v aplikacích .NET pomocí Microsoft.Extensions.Logging.ApplicationInsights balíčku zprostředkovatele. Pokud použijete tohoto zprostředkovatele, můžete dotazovat a analyzovat protokoly pomocí nástrojů Application Insights.

Poznámka:

Následující dokumentace se spoléhá na rozhraní API Přehledy Application Přehledy Classic. Dlouhodobým plánem pro application Přehledy je shromažďovat data pomocí OpenTelemetry. Další informace najdete v tématu Povolení OpenTelemetry služby Azure Monitor pro aplikace .NET, Node.js, Python a Java.

Poznámka:

Pokud chcete implementovat celou řadu telemetrických Přehledy aplikací společně s protokolováním, přečtěte si téma Konfigurace aplikačních Přehledy pro vaše ASP.NET weby nebo Přehledy aplikace pro aplikace ASP.NET Core.

Tip

Balíček Microsoft.ApplicationInsights.WorkerService NuGet, který se používá k povolení aplikačních Přehledy pro služby na pozadí, je mimo rozsah. Další informace najdete v tématu Aplikace Přehledy pro aplikace pracovních služeb.

aplikace ASP.NET Core

Přidání protokolování Přehledy aplikace do aplikací ASP.NET Core:

  1. Nainstalujte soubor Microsoft.Extensions.Logging.ApplicationInsights.

  2. Přidat 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();

S nainstalovaným balíčkem NuGet a zprostředkovatel zaregistrovaným pomocí injektáže závislostí je aplikace připravená k protokolování. Při injektáži ILogger konstruktoru je vyžadována alternativa ILogger<TCategoryName> obecného typu. Když jsou tyto implementace vyřešeny, ApplicationInsightsLoggerProvider poskytuje je. Protokolované zprávy nebo výjimky se odesílají do Přehledy aplikace.

Představte si následující příklad kontroleru:

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" };
    }
}

Další informace najdete v tématu Protokolování v ASP.NET Core a jaká aplikace Přehledy typ telemetrie se vytváří z protokolů ILoggeru? Kde se v Přehledy aplikace zobrazují protokoly ILoggeru?

Konzolová aplikace

Pokud chcete do konzolových aplikací přidat protokolování Přehledy aplikace aplikace, nejprve nainstalujte následující balíčky NuGet:

Následující příklad používá balíček Microsoft.Extensions.Logging.Application Přehledy a ukazuje výchozí chování konzolové aplikace. Balíček Microsoft.Extensions.Logging.Application Přehledy by se měl používat v konzolové aplikaci nebo kdykoli chcete použít minimální implementaci aplikačního Přehledy bez úplné sady funkcí, jako jsou metriky, distribuované trasování, vzorkování a inicializátory telemetrie.

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));
}

Další informace najdete v tématu Jaká aplikace Přehledy typ telemetrie se vytváří z protokolů ILoggeru? Kde se v Přehledy aplikace zobrazují protokoly ILoggeru?

Obory protokolování

ApplicationInsightsLoggingProvider podporuje obory protokolů. Obory jsou ve výchozím nastavení povolené.

Pokud je obor typu IReadOnlyCollection<KeyValuePair<string,object>>, pak se každý pár klíč/hodnota v kolekci přidá do aplikace Přehledy telemetrii jako vlastní vlastnosti. V následujícím příkladu jsou protokoly zachyceny jako TraceTelemetry a mají ("MyKey", "MyValue") ve vlastnostech.

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

Pokud se jako obor používá jakýkoli jiný typ, uloží se pod vlastností Scope v application Přehledy telemetrii. V následujícím příkladu TraceTelemetry má vlastnost s názvem Scope , která obsahuje obor.

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

Nejčastější dotazy

Jaký typ telemetrie Přehledy aplikace se vytváří z protokolů ILoggeru? Kde se v Přehledy aplikace zobrazují protokoly ILoggeru?

ApplicationInsightsLoggerProvider zaznamenává protokoly ILogger a vytváří TraceTelemetry z nich. Exception Pokud je objekt předán metodě Log on ILogger, ExceptionTelemetry je vytvořen místo TraceTelemetry.

Zobrazení telemetrie ILoggeru

Na webu Azure Portal:

  1. Přejděte na Azure Portal a přejděte k prostředku Přehledy aplikace.
  2. Klikněte na oddíl Protokoly v Přehledy aplikace.
  3. K dotazování zpráv ILoggeru, obvykle uložených traces v tabulce, použijte dotazovací jazyk Kusto (KQL).
    • Příklad dotazu: traces | where message contains "YourSearchTerm".
  4. Zpřesněte dotazy a vyfiltrujte data ILoggeru podle závažnosti, časového rozsahu nebo konkrétního obsahu zprávy.

V sadě Visual Studio (místní ladicí program):

  1. Spusťte aplikaci v režimu ladění v sadě Visual Studio.
  2. Během spuštění aplikace otevřete okno Diagnostické nástroje.
  3. Na kartě Události se zobrazí protokoly ILogger spolu s dalšími telemetrickými daty.
  4. Pomocí funkcí vyhledávání a filtrování v okně Diagnostické nástroje vyhledejte konkrétní zprávy ILoggeru.

Pokud chcete vždy odesílat TraceTelemetry, použijte tento fragment kódu:

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

Proč některé protokoly ILoggeru nemají stejné vlastnosti jako jiné?

Aplikace Přehledy zaznamenává a odesílá protokoly ILogger pomocí stejných TelemetryConfiguration informací, které se používají pro každou další telemetrii. Ale je tu výjimka. Ve výchozím nastavení TelemetryConfiguration se při přihlašování z Program.cs nebo Startup.cs úplně nenastaví. Protokoly z těchto míst nemají výchozí konfiguraci, takže nespouštět všechny TelemetryInitializer instance a TelemetryProcessor instance.

Používám samostatný balíček Microsoft.Extensions.Logging.Application Přehledy a chci ručně protokolovat další vlastní telemetrii. Jak to mám udělat?

Pokud použijete samostatný balíček, TelemetryClient nevkážou se do kontejneru injektáže závislostí (DI). Potřebujete vytvořit novou instanci TelemetryClient a použít stejnou konfiguraci, kterou používá zprostředkovatel loggeru, jak ukazuje následující kód. Tento požadavek zajišťuje, aby se stejná konfigurace používala pro veškerou vlastní telemetrii a telemetrii z 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;
   }  
}

Poznámka:

Pokud balíček použijete Microsoft.ApplicationInsights.AspNetCore k povolení Přehledy aplikace, upravte tento kód tak, aby se dostal TelemetryClient přímo do konstruktoru.

Nemám nainstalovanou sadu SDK a k povolení aplikačních Přehledy pro aplikace ASP.NET Core používám rozšíření Azure Web Apps. Návody použít nového poskytovatele?

Rozšíření Application Přehledy ve službě Azure Web Apps používá nového poskytovatele. Pravidla filtrování můžete upravit v souboru appsettings.json pro vaši aplikaci.

Další kroky