Registro em log do Application Insights com .NET
Neste artigo, você aprenderá a capturar logs com o Application Insights em aplicativos .NET usando o pacote do Microsoft.Extensions.Logging.ApplicationInsights
provedor. Se você usar esse provedor, poderá consultar e analisar seus logs usando as ferramentas do Application Insights.
Atenção
Recomendamos a Distro OpenTelemetry do Azure Monitor para novos aplicativos ou clientes para potencializar o Azure Monitor Application Insights. A Distro OpenTelemetry do Azure Monitor oferece uma funcionalidade e experiência semelhantes às do SDK do Application Insights. É possível migrar do SDK do Application Insights usando os guias de migração para .NET, Node.js e Python, mas ainda estamos trabalhando para adicionar mais alguns recursos para compatibilidade com versões anteriores.
Nota
Se você quiser implementar a gama completa de telemetria do Application Insights junto com o registro em log, consulte Configurar o Application Insights para seus sites ASP.NET ou Application Insights para aplicativos ASP.NET Core.
Gorjeta
O Microsoft.ApplicationInsights.WorkerService
pacote NuGet, usado para habilitar o Application Insights para serviços em segundo plano, está fora do escopo. Para obter mais informações, consulte Application Insights for Worker Service apps.
ASP.NET Aplicações principais
Para adicionar o log do Application Insights aos aplicativos ASP.NET Core:
Instale o
Microsoft.Extensions.Logging.ApplicationInsights
arquivo .Adicionar
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();
Com o pacote NuGet instalado e o provedor sendo registrado com injeção de dependência, o aplicativo está pronto para registrar. Com a injeção do construtor, uma ou ILogger a alternativa ILogger<TCategoryName> do tipo genérico é necessária. Quando essas implementações são resolvidas, ApplicationInsightsLoggerProvider
fornece-as. Mensagens registradas ou exceções são enviadas para o Application Insights.
Considere o seguinte exemplo de controlador:
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 obter mais informações, consulte Fazendo login no ASP.NET Core e Qual tipo de telemetria do Application Insights é produzido a partir de logs ILogger? Onde posso ver os logs do ILogger no Application Insights?.
Aplicação de consola
Para adicionar o log do Application Insights aos aplicativos de console, primeiro instale os seguintes pacotes NuGet:
O exemplo a seguir usa o pacote Microsoft.Extensions.Logging.ApplicationInsights e demonstra o comportamento padrão para um aplicativo de console. O pacote Microsoft.Extensions.Logging.ApplicationInsights deve ser usado em um aplicativo de console ou sempre que você quiser uma implementação mínima do Application Insights sem o conjunto completo de recursos, como métricas, rastreamento distribuído, amostragem e inicializadores de telemetria.
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 obter mais informações, consulte Qual tipo de telemetria do Application Insights é produzido a partir de logs ILogger? Onde posso ver os logs do ILogger no Application Insights?.
Escopos de registro em log
ApplicationInsightsLoggingProvider
Suporta escopos de log. Os escopos são habilitados por padrão.
Se o escopo for do tipo IReadOnlyCollection<KeyValuePair<string,object>>
, cada par chave/valor na coleção será adicionado à telemetria do Application Insights como propriedades personalizadas. No exemplo a seguir, os logs são capturados como TraceTelemetry
e tem ("MyKey", "MyValue")
em propriedades.
using (_logger.BeginScope(new Dictionary<string, object> { ["MyKey"] = "MyValue" }))
{
_logger.LogError("An example of an Error level message");
}
Se qualquer outro tipo for usado como escopo, ele será armazenado sob a propriedade Scope
na telemetria do Application Insights. No exemplo a seguir, TraceTelemetry
tem uma propriedade chamada Scope
que contém o escopo.
using (_logger.BeginScope("hello scope"))
{
_logger.LogError("An example of an Error level message");
}
Perguntas mais frequentes
Que tipo de telemetria do Application Insights é produzido a partir de logs ILogger? Onde posso ver os logs do ILogger no Application Insights?
ApplicationInsightsLoggerProvider
captura ILogger
logs e cria TraceTelemetry
a partir deles. Se um Exception
objeto for passado para o Log
método em ILogger
, ExceptionTelemetry
será criado em vez de TraceTelemetry
.
Visualizando a Telemetria ILogger
No portal do Azure:
- Vá para o portal do Azure e acesse seu recurso do Application Insights.
- Selecione a seção Logs dentro do Application Insights.
- Use Kusto Query Language (KQL) para consultar mensagens ILogger armazenadas na
traces
tabela. Exemplo de consulta:traces | where message contains "YourSearchTerm"
. - Refine suas consultas para filtrar dados ILogger por gravidade, intervalo de tempo ou conteúdo específico da mensagem.
No Visual Studio (Depurador Local):
- Inicie seu aplicativo no modo de depuração no Visual Studio.
- Abra a janela Ferramentas de diagnóstico enquanto o aplicativo é executado.
- Na guia Eventos, os logs do ILogger aparecem junto com outros dados de telemetria.
- Para localizar mensagens ILogger específicas, use os recursos de pesquisa e filtro na janela Ferramentas de diagnóstico.
Se preferir enviar TraceTelemetry
sempre, use este trecho:
builder.AddApplicationInsights(
options => options.TrackExceptionsAsExceptionTelemetry = false);
Por que alguns logs ILogger não têm as mesmas propriedades que outros?
O Application Insights captura e envia ILogger
logs usando as mesmas TelemetryConfiguration
informações usadas para todas as outras telemetrias. Mas há uma exceção. Por padrão, TelemetryConfiguration
não está totalmente configurado quando você faz login a partir do Program.cs ou Startup.cs. Os logs desses locais não têm a configuração padrão, portanto, não estão executando todas as TelemetryInitializer
instâncias e TelemetryProcessor
instâncias.
Estou usando o pacote autônomo Microsoft.Extensions.Logging.ApplicationInsights e quero registrar mais telemetria personalizada manualmente. Como devo fazê-lo?
Quando você usa o pacote autônomo, TelemetryClient
não é injetado no contêiner de injeção de dependência (DI). Você precisa criar uma nova instância e usar a mesma configuração que o provedor de TelemetryClient
logger usa, como mostra o código a seguir. Esse requisito garante que a mesma configuração seja usada para todas as telemetrias e telemetrias personalizadas do 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
Se você usar o pacote para habilitar o Microsoft.ApplicationInsights.AspNetCore
Application Insights, modifique esse código para entrar TelemetryClient
diretamente no construtor.
Não tenho o SDK instalado e uso a extensão de Aplicativos Web do Azure para habilitar o Application Insights para meus aplicativos ASP.NET Core. Como posso utilizar o novo fornecedor?
A extensão do Application Insights nos Aplicativos Web do Azure usa o novo provedor. Você pode modificar as regras de filtragem no arquivo appsettings.json para seu aplicativo.