Compartir a través de


Registro de Application Insights con .NET

En este artículo obtendrá información sobre cómo capturar registros con Application Insights en aplicaciones de .NET usando el paquete de proveedor de Microsoft.Extensions.Logging.ApplicationInsights. Si usa este proveedor, puede consultar y analizar los registros mediante las herramientas de Application Insights.

Precaución

Recomendamos la Distribución de OpenTelemetry de Azure Monitor para que las nuevas aplicaciones o clientes alimenten Azure Monitor Application Insights. La Distribución de OpenTelemetry de Azure Monitor ofrece una funcionalidad y experiencia similares al SDK de Application Insights. Es posible migrar desde el SDK de Application Insights usando las guías de migración para .NET, Node.js, y Python, pero todavía estamos trabajando para agregar unas pocas características más para la compatibilidad con versiones anteriores.

Sugerencia

Aplicaciones de ASP.NET Core

Para agregar el registro de Application Insights a las aplicaciones ASP.NET Core:

  1. Instale los Microsoft.Extensions.Logging.ApplicationInsights.

  2. Agregue 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();

Con el paquete NuGet instalado y el proveedor registrado mediante inyección de dependencias, la aplicación está lista para registrar eventos. Con la inserción de constructores, se necesita ILogger o la alternativa de tipo genérico ILogger<TCategoryName>. Cuando se resuelvan estas implementaciones, ApplicationInsightsLoggerProvider las proporcionará. Las excepciones o los mensajes registrados se enviarán a Application Insights.

Considere el siguiente controlador de ejemplo:

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

Para más información, consulte Registro en ASP.NET Core y ¿Qué tipo de telemetría de Application Insights se genera a partir de registros de ILogger? ¿Dónde puedo ver los registros de ILogger en Application Insights?.

Aplicación de consola

Para agregar el registro de Application Insights a las aplicaciones de la consola, primero instala los siguientes paquetes de NuGet:

En el ejemplo siguiente se usa el paquete Microsoft.Extensions.Logging.ApplicationInsights y se muestra el comportamiento predeterminado para una aplicación de consola. El paquete Microsoft.Extensions.Logging.ApplicationInsights debe usarse en una aplicación de consola o siempre que desee una implementación mínima de Application Insights sin el conjunto de características completo, como métricas, seguimiento distribuido, muestreo e inicializadores de telemetría.

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

Para más información, consulte ¿Qué tipo de telemetría de Application Insights se genera a partir de registros de ILogger? ¿Dónde puedo ver los registros de ILogger en Application Insights?

Ámbitos de registro

ApplicationInsightsLoggingProvider admite ámbitos de registro. Los ámbitos están habilitados de manera predeterminada.

Si el ámbito es de tipo IReadOnlyCollection<KeyValuePair<string,object>>, todos los pares clave-valor de la colección se agregan a los datos de telemetría de Application Insights como propiedades personalizadas. En el siguiente ejemplo, los registros se capturan como TraceTelemetry y tienen ("MyKey", "MyValue") en las propiedades.

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

Si se usa cualquier otro tipo como ámbito, se almacena en la propiedad Scope en la telemetría de Application Insights. En el siguiente ejemplo, TraceTelemetry tiene una propiedad denominada Scope que contiene el ámbito.

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

Pasos siguientes