Registro do cliente HTTP no .NET

Quando você cria aplicativos que fazem solicitações HTTP, o log estruturado ajuda você a monitorar, solucionar problemas e analisar o tráfego de saída. A extensão AddExtendedHttpClientLogging fornece registro em log aprimorado para todos os clientes HTTP criados com IHttpClientFactory, com suporte interno para:

  • Log configurável – Controle o que é registrado (cabeçalhos, corpo, parâmetros de consulta, parâmetros de rota)
  • Redação de dados – Aplicar políticas de classificação e redação de dados para privacidade e conformidade
  • Enriquecimento de log – Adicionar contexto personalizado aos logs de solicitação HTTP
  • Sobrecarga mínima – recursos de aceitação com padrões conscientes do desempenho

Habilite o registro em log avançado do cliente HTTP chamando o método de extensão AddExtendedHttpClientLogging. Isso substitui o logger padrão do cliente HTTP com um logger estendido que dá suporte a recursos detalhados de configuração e conformidade de dados.

Adicionar o pacote

dotnet add package Microsoft.Extensions.Http.Diagnostics

Ou, se você estiver usando o SDK do .NET 10+:

dotnet package add Microsoft.Extensions.Http.Diagnostics

Para obter mais informações, consulte dotnet package add ou Gerenciar dependências de pacotes em aplicativos .NET.

Habilitar o registro em log do cliente HTTP

Para adicionar o registro avançado de cliente HTTP ao seu aplicativo, chame o método de extensão AddExtendedHttpClientLogging ao configurar seus serviços:

using Microsoft.Extensions.DependencyInjection;

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);

// Register redaction services (required)
builder.Services.AddRedaction();

// Add enhanced HTTP client logging
builder.Services.AddExtendedHttpClientLogging();

// Add your HTTP clients
builder.Services.AddHttpClient<MyApiClient>();

using IHost host = builder.Build();

await host.RunAsync();

Este registro adiciona um registrador aprimorado a todos os clientes HTTP criados através de IHttpClientFactory, substituindo o registrador padrão por um que dá suporte à configuração avançada.

Importante

AddExtendedHttpClientLogging() remove todos os outros registradores, incluindo o padrão registrado por meio de AddDefaultLogger(). Isso garante um comportamento de log consistente em todos os clientes HTTP.

Importante

Você deve cadastrar serviços de edição chamando AddRedaction do pacote Microsoft.Extensions.Compliance.Redaction. O recurso de registro em log do cliente HTTP redige informações confidenciais por padrão (como parâmetros de rota) e requer um provedor de redator no contêiner de injeção de dependência.

Aplicar o registro em log a clientes HTTP específicos

Você também pode aplicar logging aprimorado a clientes HTTP específicos, nomeados ou tipados, usando os métodos de extensão IHttpClientBuilder.

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);

// Register redaction services (required)
builder.Services.AddRedaction();

// Apply to a named client
builder.Services.AddHttpClient("MyNamedClient")
    .AddExtendedHttpClientLogging();

// Apply to a typed client with configuration
builder.Services.AddHttpClient<MyApiClient>()
    .AddExtendedHttpClientLogging(options =>
    {
        options.LogBody = true;
        options.ResponseBodyContentTypes.Add("application/json");
    });

using IHost host = builder.Build();

await host.RunAsync();    

Ao usar as sobrecargas IHttpClientBuilder, o logging é aplicado somente a esse cliente específico, não globalmente.

Exibindo dados de log enriquecidos

O registro em log avançado do cliente HTTP adiciona informações aos logs usando enriquecimento, o que significa que os dados são adicionados como marcas a logs estruturados e não à mensagem do console. Para exibir as informações enriquecidas, use um provedor de log que dê suporte a logs estruturados.

Para testes rápidos, use AddJsonConsole para imprimir logs estruturados no terminal.

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);

builder.Logging.AddJsonConsole();

builder.Services.AddRedaction();

builder.Services.AddHttpClient("MyClient")
    .AddExtendedHttpClientLogging(options =>
    {
        options.LogBody = true;
        options.ResponseBodyContentTypes.Add("application/json");
    });

Para cenários de produção, considere o uso de provedores de log estruturados, como Application Insights, Seq ou Elasticsearch, que podem consultar e visualizar os dados de marca enriquecidos.

Configurar opções de registo

Você configura o registro em log do cliente HTTP por meio da LoggingOptions classe usando o padrão de opções padrão. Você pode configurar opções no código ou associá-las da configuração (por exemplo, appsettings.json).

Configurar com um delegado

builder.Services.AddExtendedHttpClientLogging(options =>
{
    // Log request headers with data classification
    options.RequestHeadersDataClasses.Add("User-Agent", DataClassification.None);
    options.RequestHeadersDataClasses.Add("Authorization", DataClassification.Unknown);

    // Log response headers
    options.ResponseHeadersDataClasses.Add("Content-Type", DataClassification.None);

    // Enable request/response body logging (use carefully in production)
    options.LogBody = true;
    options.BodySizeLimit = 4096; // Limit to 4KB
    options.RequestBodyContentTypes.Add("application/json");
    options.ResponseBodyContentTypes.Add("application/json");
});

Configurar a partir de appsettings.json

{
  "HttpClientLogging": {
    "LogRequestStart": false,
    "LogBody": false,
    "BodySizeLimit": 32768,
    "BodyReadTimeout": "00:00:01",
    "RequestHeadersDataClasses": {
      "User-Agent": "None",
      "Content-Type": "None"
    },
    "ResponseHeadersDataClasses": {
      "Content-Type": "None"
    },
    "RequestPathLoggingMode": "Formatted",
    "RequestPathParameterRedactionMode": "Strict"
  }
}
builder.Services.AddExtendedHttpClientLogging(
    builder.Configuration.GetSection("HttpClientLogging"));

Opções de configuração

A LoggingOptions classe fornece as seguintes opções de configuração:

Opções básicas de registro em log

Opção Tipo Padrão DESCRIÇÃO
LogRequestStart bool false Quando true, registra a solicitação antes do início do processamento. Quando false, registra uma única entrada com dados de solicitação e resposta.
LogBody bool false Habilita o registro em log de corpos de solicitação e resposta HTTP. Aviso: evite habilitar na produção, pois pode vazar informações confidenciais.
BodySizeLimit int 32.768 (≈32KB) Número máximo de bytes a serem lidos do corpo da solicitação ou da resposta. Mantenha o tamanho abaixo de 85.000 bytes para evitar a alocação no heap de objetos grandes.
BodyReadTimeout TimeSpan 1 segundo Tempo máximo para aguardar ao ler o corpo da solicitação ou da resposta. Deve estar entre 1 milissegundo e 1 minuto.
RequestBodyContentTypes ISet<string> Vazio Tipos de conteúdo de solicitação HTTP considerados texto e qualificados para serialização.
ResponseBodyContentTypes ISet<string> Vazio Tipos de conteúdo de resposta HTTP considerados texto e qualificados para serialização.

Registro de cabeçalhos e parâmetros de consulta

Opção Tipo Padrão DESCRIÇÃO
RequestHeadersDataClasses IDictionary<string, DataClassification> Vazio Cabeçalhos de solicitação HTTP para fazer logon com suas classificações de dados para redação. Se estiver vazio, nenhum cabeçalho de solicitação será registrado.
ResponseHeadersDataClasses IDictionary<string, DataClassification> Vazio Cabeçalhos de resposta HTTP para fazer logon com suas classificações de dados para redação. Se estiver vazio, nenhum cabeçalho de resposta será registrado.
RequestQueryParametersDataClasses IDictionary<string, DataClassification> Vazio Parâmetros de consulta de solicitação HTTP para fazer logon com suas classificações de dados. Se estiver vazio, nenhum parâmetro de consulta será registrado. Recurso experimental.
LogContentHeaders bool false Habilitar o registro em log de cabeçalhos de conteúdo HTTP (por exemplo, Content-Type). Habilitar somente se os cabeçalhos de conteúdo estiverem dentro RequestHeadersDataClasses ou ResponseHeadersDataClasses. Recurso experimental.

Registro em log de parâmetros de caminho e rota

Opção Tipo Padrão DESCRIÇÃO
RequestPathLoggingMode OutgoingPathLoggingMode Formatted Como registrar o caminho de solicitação HTTP de saída. Aplicado somente quando RequestPathParameterRedactionMode não for None.
RequestPathParameterRedactionMode HttpRouteParameterRedactionMode Strict Como redigir parâmetros de caminho em solicitações HTTP de saída.
RouteParameterDataClasses IDictionary<string, DataClassification> Vazio Roteie parâmetros a serem redigidos com suas correspondentes classificações de dados.

Adicionar enriquecedores de registros

Os enriquecidores de log do cliente HTTP permitem adicionar informações contextuais personalizadas aos logs de cliente HTTP com base na solicitação, resposta e quaisquer exceções. Ao contrário dos enriquecedores de log de uso geral, os enriquecedores do cliente HTTP são especificamente voltados para solicitações HTTP de saída e têm acesso ao contexto específico de HTTP.

Aqui está um exemplo rápido:

public class CustomHttpLogEnricher : IHttpClientLogEnricher
{
    public void Enrich(IEnrichmentTagCollector collector,
        HttpRequestMessage request, HttpResponseMessage? response, Exception? exception)
    {
        // Add tags based on the exception (if available)
        if (exception is not null)
        {
            collector.Add("error_type", exception.GetType().Name);
        }
    }
}

// Register the enricher
builder.Services.AddHttpClientLogEnricher<CustomHttpLogEnricher>();

Para obter informações detalhadas sobre como criar e usar enriquecidores de log de cliente HTTP, incluindo práticas recomendadas e cenários avançados, consulte o enriquecidor de log do cliente HTTP.

Classificação e redação de dados

O log do cliente HTTP integra-se aos recursos de redação de dados e classificação de dados para proteger informações confidenciais. Quando você especifica um DataClassification para cabeçalhos, parâmetros de consulta ou parâmetros de rota, o sistema de redação aplica a redação apropriada com base em seus refatoradores configurados.

Exemplo: Redigir cabeçalhos confidenciais

using Microsoft.Extensions.Compliance.Classification;

builder.Services.AddExtendedHttpClientLogging(options =>
{
    // Public headers - no redaction
    options.RequestHeadersDataClasses.Add("User-Agent", DataClassification.None);
    options.RequestHeadersDataClasses.Add("Content-Type", DataClassification.None);

    // Sensitive headers - apply redaction
    options.RequestHeadersDataClasses.Add("Authorization", DataClassification.Unknown);
    options.RequestHeadersDataClasses.Add("X-API-Key", DataClassification.Unknown);
});

Para obter mais informações sobre como configurar redatores, consulte Redação de dados no .NET.

Redação de parâmetros de caminho e rota

Por padrão, o registro de logs do cliente HTTP oculta os caminhos de solicitação e resposta para proteger a privacidade. Ao registrar caminhos de solicitação HTTP, você pode controlar como os parâmetros de rota são redigidos usando a opção RequestPathParameterRedactionMode :

Modo DESCRIÇÃO Example
None Sem redação, o caminho completo é registrado /api/users/12345/orders/67890
Strict Todos os parâmetros de caminho são ocultados /api/users/{userId}/orders/{orderId}
Loose Somente os parâmetros em RouteParameterDataClasses são redigidos /api/users/12345/orders/{orderId}

A RequestPathLoggingMode opção controla o formato do caminho registrado:

Modo DESCRIÇÃO Example
Formatted Usa o modelo de rota com nomes de parâmetro /api/users/{userId}/orders/{orderId}
Structured Caminho e parâmetros de logs separadamente Caminho: /api/users/*/orders/*, Params: {userId, orderId}

Exemplo: Desabilitar a redação do caminho

Para registrar caminhos completos e não redigidos (por exemplo, em ambientes de desenvolvimento), defina RequestPathParameterRedactionMode como None:

builder.Services.AddExtendedHttpClientLogging(options =>
{
    // Disable redaction of request/response paths
    options.RequestPathParameterRedactionMode = HttpRouteParameterRedactionMode.None;
});

Cuidado

Desativar a ocultação de caminho pode expor informações confidenciais em logs. Use HttpRouteParameterRedactionMode.None apenas no desenvolvimento ou quando você tiver certeza de que os caminhos não contêm dados confidenciais.

Considerações sobre desempenho

O registro em log de cliente HTTP aprimorado foi projetado focando no desempenho, mas há balanceamentos a serem considerados:

  • Registro do corpo: A ativação de LogBody adiciona sobrecarga para o buffer e a leitura do corpo da solicitação/resposta. Use BodySizeLimit e BodyReadTimeout para controlar o uso de recursos.
  • Registro de cabeçalho: Registre somente os cabeçalhos necessários. O processo de esvaziar RequestHeadersDataClasses e ResponseHeadersDataClasses evita a sobrecarga de processamento de cabeçalho.
  • Enriquecedores: cada enriquecedor registrado é chamado em cada solicitação. Mantenha a lógica de enriquecimento leve.
  • Redação: a classificação e a redação de dados adicionam sobrecarga mínima, mas dimensionam com o número de itens classificados.

Dica

Em ambientes de produção, comece com o registro em log mínimo (sem corpo, cabeçalhos limitados) e habilite o registro em log adicional apenas para solução de problemas.

Consulte também