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.
Nota:
La siguiente documentación se basa en la API clásica de Application Insights. El plan a largo plazo de Application Insights consiste en recopilar datos mediante OpenTelemetry. Para más información, vea Habilitación de OpenTelemetry de Azure Monitor para aplicaciones de .NET, Node.js, Python y Java y nuestro plan de desarrollo de OpenTelemetry. La guía de migración está disponible para .NET, Node.jsy Python.
Nota:
Si desea implementar la gama completa de telemetría de Application Insights junto con el registro, consulte Configuración de Application Insights para los sitios web de ASP.NET o Application Insights para aplicaciones ASP.NET Core.
Sugerencia
Está fuera del ámbito el paquete Microsoft.ApplicationInsights.WorkerService
de NuGet, que se usa para habilitar Application Insights para servicios en segundo plano. Para más información, consulte Application Insights para aplicaciones de Worker Service.
Aplicaciones de ASP.NET Core
Para agregar el registro de Application Insights a las aplicaciones ASP.NET Core:
Instale los
Microsoft.Extensions.Logging.ApplicationInsights
.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 con la inserción de dependencias, la aplicación está lista para registrarse. 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");
}
Preguntas más frecuentes
¿Qué tipo de datos de telemetría de Application Insights se generan a partir de los registros de ILogger? ¿Dónde puedo ver los registros de ILogger en Application Insights?
ApplicationInsightsLoggerProvider
captura registros de ILogger
y crea TraceTelemetry
a partir de estos. Si se pasa un objeto Exception
al método Log
en ILogger
, se crea ExceptionTelemetry
en lugar de TraceTelemetry
.
Visualización de la telemetría de ILogger
En el Portal de Azure:
- Vaya a Azure Portal y acceda al recurso de Application Insights.
- Haga clic en la sección Registros dentro de Application Insights.
- Use el lenguaje de consulta Kusto (KQL) para consultar los mensajes ILogger almacenados en la tabla
traces
. Ejemplo de consulta:traces | where message contains "YourSearchTerm"
. - Refine las consultas para filtrar los datos de ILogger por gravedad, intervalo de tiempo o contenido de mensaje específico.
En Visual Studio (depurador local):
- Ejecute la aplicación en modo de depuración en Visual Studio.
- Abra la ventana Herramientas de diagnóstico mientras se ejecuta la aplicación.
- En la pestaña Eventos, los registros de ILogger aparecen junto con otros datos de telemetría.
- Para buscar mensajes ILogger específicos, use las características de búsqueda y filtro en la ventana Herramientas de diagnóstico.
Si prefiere enviar TraceTelemetry
siempre, use este fragmento de código:
builder.AddApplicationInsights(
options => options.TrackExceptionsAsExceptionTelemetry = false);
¿Por qué algunos registros de ILogger no tiene las mismas propiedades que otros?
Application Insights captura y envía los registros de ILogger
usando la misma información de TelemetryConfiguration
que se usa para los demás datos de telemetría. Sin embargo, hay una excepción. De manera predeterminada, TelemetryConfiguration
no se ha configurado por completo al registrarse desde Program.cs o Startup.cs. Los registros con estas procedencias no tienen la configuración predeterminada, por lo que no se ejecutan todas las instancias TelemetryInitializer
y TelemetryProcessor
.
Estoy usando el paquete independiente Microsoft.Extensions.Logging.ApplicationInsights y quiero registrar manualmente más datos de telemetría personalizados. ¿Cómo debo hacerlo?
Cuando se usa el paquete independiente, TelemetryClient
no se inserta en el contenedor de inserción de dependencias (DI). Debe crear una instancia de TelemetryClient
y usar la misma configuración que el proveedor del registrador, tal y como se muestra en el siguiente código. Este requisito garantiza que se use la misma configuración para todos los datos de telemetría personalizados y los datos de telemetría de 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;
}
}
Nota
Si utiliza el paquete Microsoft.ApplicationInsights.AspNetCore
para habilitar Application Insights, modifique este código para obtener TelemetryClient
directamente en el constructor.
No tengo instalado el SDK y uso la extensión Web Apps de Azure para habilitar Application Insights para mis aplicaciones de ASP.NET Core. ¿Cómo uso el nuevo proveedor?
La extensión de Application Insights en Azure Web Apps usa el nuevo proveedor. Puede modificar las reglas de filtrado en el archivo appsettings.json para la aplicación.