Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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
LogBodyadiciona sobrecarga para o buffer e a leitura do corpo da solicitação/resposta. UseBodySizeLimiteBodyReadTimeoutpara controlar o uso de recursos. -
Registro de cabeçalho: Registre somente os cabeçalhos necessários. O processo de esvaziar
RequestHeadersDataClasseseResponseHeadersDataClassesevita 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.