Registro HTTP en ASP.NET Core

Registro HTTP es un middleware que registra información sobre las solicitudes HTTP y las respuestas HTTP. El registro HTTP proporciona registros de:

  • Información de solicitud HTTP
  • Propiedades comunes
  • Encabezados
  • Cuerpo
  • Información de respuesta HTTP

Registro HTTP es útil en varios escenarios para:

  • Registrar información sobre las solicitudes y respuestas entrantes.
  • Filtrar las partes de la solicitud y la respuesta que se registran.
  • Filtrar los encabezados que se registrarán.

Registro HTTP puede reducir el rendimiento de una aplicación, especialmente al registrar los cuerpos de solicitud y respuesta. Tenga en cuenta el impacto en el rendimiento al seleccionar los campos que se van a registrar. Pruebe cómo inciden en el rendimiento las propiedades de registro seleccionadas.

Advertencia

Registro HTTP puede registrar potencialmente información de identificación personal (PII). Tenga en cuenta el riesgo y evite registrar información confidencial.

Habilitación de Registro HTTP

Registro HTTP está habilitado con UseHttpLogging, que agrega middleware de registro HTTP.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseHttpLogging();

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGet("/", async context =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    });
}

De forma predeterminada, Registro HTTP registra propiedades comunes como ruta de acceso, código de estado y encabezados para solicitudes y respuestas. La salida se registra como un único mensaje en LogLevel.Information.

Salida de solicitud de ejemplo

Opciones de Registro HTTP

Para configurar el middleware de registro HTTP, llame a AddHttpLogging en ConfigureServices.

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpLogging(logging =>
    {
        // Customize HTTP logging here.
        logging.LoggingFields = HttpLoggingFields.All;
        logging.RequestHeaders.Add("My-Request-Header");
        logging.ResponseHeaders.Add("My-Response-Header");
        logging.MediaTypeOptions.AddText("application/javascript");
        logging.RequestBodyLogLimit = 4096;
        logging.ResponseBodyLogLimit = 4096;
    });
}

LoggingFields

HttpLoggingOptions.LoggingFields es una marca de enumeración que configura partes específicas de la solicitud y respuesta para registrar. LoggingFields se establece de forma predeterminada en RequestPropertiesAndHeaders | ResponsePropertiesAndHeaders.

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpLogging(logging =>
    {
        // Customize HTTP logging here.
        logging.LoggingFields = HttpLoggingFields.All;
        logging.RequestHeaders.Add("My-Request-Header");
        logging.ResponseHeaders.Add("My-Response-Header");
        logging.MediaTypeOptions.AddText("application/javascript");
        logging.RequestBodyLogLimit = 4096;
        logging.ResponseBodyLogLimit = 4096;
    });
}
Marca Marca para registrar HTTP Value
Ninguno Sin registro. 0x0
RequestPath Ruta de acceso de solicitud, que incluye Path y PathBase. 0x1
RequestQuery QueryString de solicitud. 0x2
RequestProtocol Protocol de solicitud. 0x4
RequestMethod Method de solicitud. 0x8
RequestScheme Scheme de solicitud. 0x10
ResponseStatusCode StatusCode de respuesta. 0x20
RequestHeaders Headers de solicitud. Los encabezados de solicitud se registran en cuanto se invoca el middleware. Los encabezados se redactan de manera predeterminada con el carácter "[Redacted]", a menos que se especifique en HttpLoggingOptions.RequestHeaders. 0x40
ResponseHeaders Headers de respuesta. Los encabezados de respuesta se registran cuando se escribe a Body o cuando se llama a StartAsync. Los encabezados se redactan de manera predeterminada con el carácter "[Redacted]", a menos que se especifique en HttpLoggingOptions.ResponseHeaders. 0x80
RequestTrailers Solicite IHttpRequestTrailersFeature.Trailers. Los finalizadores de solicitud no se registran actualmente. 0x100
ResponseTrailers Respuesta IHttpResponseTrailersFeature.Trailers. Los finalizadores de respuesta no se registran actualmente. 0x200
RequestBody Body de solicitud. El registro del cuerpo de la solicitud tiene implicaciones en el rendimiento, ya que requiere almacenar en búfer todo el cuerpo de la solicitud hasta HttpLoggingOptions.RequestBodyLogLimit. 0x400
ResponseBody Body de respuesta. El registro del cuerpo de la respuesta tiene implicaciones en el rendimiento, ya que requiere almacenar en búfer todo el cuerpo de la respuesta hasta HttpLoggingOptions.ResponseBodyLogLimit. 0x800
RequestProperties Marca para registrar una colección de propiedades de solicitud HTTP, incluidas RequestPath, RequestQuery, RequestProtocol, RequestMethod y RequestScheme. RequestPath | RequestQuery | RequestProtocol | RequestMethod | RequestScheme
RequestPropertiesAndHeaders Marca para registrar encabezados y propiedades de solicitud HTTP. Incluye RequestProperties y RequestHeaders. RequestProperties | RequestHeaders
ResponsePropertiesAndHeaders Marca para registrar encabezados y propiedades de respuesta HTTP. Incluye ResponseStatusCode y ResponseHeaders. ResponseStatusCode | ResponseHeaders
Request Marca para registrar toda la solicitud HTTP. Incluye RequestPropertiesAndHeaders y RequestBody. El registro del cuerpo de la solicitud tiene implicaciones en el rendimiento, ya que requiere almacenar en búfer todo el cuerpo de la solicitud hasta HttpLoggingOptions.RequestBodyLogLimit. RequestPropertiesAndHeaders | RequestBody
Response Marca para registrar toda la respuesta HTTP. Incluye ResponseStatusCode, ResponseHeaders y ResponseBody. El registro del cuerpo de la respuesta tiene implicaciones en el rendimiento, ya que requiere almacenar en búfer todo el cuerpo de la respuesta hasta HttpLoggingOptions.ResponseBodyLogLimit. ResponseStatusCode | ResponseHeaders | ResponseBody
All Marca para registrar la solicitud y la respuesta HTTP. Incluye Request y Response. El registro del cuerpo de la solicitud y la respuesta tiene implicaciones de rendimiento, ya que requiere almacenar en búfer todo el cuerpo de la solicitud y la respuesta hasta HttpLoggingOptions.RequestBodyLogLimit y HttpLoggingOptions.ResponseBodyLogLimit. Request | Response

RequestHeaders

RequestHeaders son un conjunto de encabezados de solicitud HTTP que se pueden registrar. Los valores de encabezado solo se registran para los nombres de encabezado que están en esta colección.

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpLogging(logging =>
    {
        // Customize HTTP logging here.
        logging.LoggingFields = HttpLoggingFields.All;
        logging.RequestHeaders.Add("My-Request-Header");
        logging.ResponseHeaders.Add("My-Response-Header");
        logging.MediaTypeOptions.AddText("application/javascript");
        logging.RequestBodyLogLimit = 4096;
        logging.ResponseBodyLogLimit = 4096;
    });
}

ResponseHeaders

ResponseHeaders son un conjunto de encabezados de respuesta HTTP que se pueden registrar. Los valores de encabezado solo se registran para los nombres de encabezado que están en esta colección.

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpLogging(logging =>
    {
        // Customize HTTP logging here.
        logging.LoggingFields = HttpLoggingFields.All;
        logging.RequestHeaders.Add("My-Request-Header");
        logging.ResponseHeaders.Add("My-Response-Header");
        logging.MediaTypeOptions.AddText("application/javascript");
        logging.RequestBodyLogLimit = 4096;
        logging.ResponseBodyLogLimit = 4096;
    });
}

MediaTypeOptions

MediaTypeOptions proporciona la configuración para seleccionar la codificación que se va a usar para un tipo de medio específico.

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpLogging(logging =>
    {
        // Customize HTTP logging here.
        logging.LoggingFields = HttpLoggingFields.All;
        logging.RequestHeaders.Add("My-Request-Header");
        logging.ResponseHeaders.Add("My-Response-Header");
        logging.MediaTypeOptions.AddText("application/javascript");
        logging.RequestBodyLogLimit = 4096;
        logging.ResponseBodyLogLimit = 4096;
    });
}

Métodos de MediaTypeOptions

  • public void AddText(string contentType)
    • Agrega un objeto contentType que se usará para el registro como texto mediante la codificación UTF-8.
  • public void AddText(string contentType, Encoding encoding)
    • Agrega un objeto contentType que se usará para el registro como texto mediante la codificación especificada.
  • public void AddBinary(MediaTypeHeaderValue mediaType)
    • Agrega un objeto MediaTypeHeaderValue que se va a usar para el registro como binario.
  • public void AddBinary(string contentType)
    • Agrega un contenido que se usará para el registro como texto mediante el tipo de contenido especificado.
  • public void Clear()
    • Borra todos los objetos MediaTypes.

RequestBodyLogLimit

Tamaño máximo del cuerpo de la solicitud para registrar, en bytes. El valor predeterminado es 32 KB.

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpLogging(logging =>
    {
        // Customize HTTP logging here.
        logging.LoggingFields = HttpLoggingFields.All;
        logging.RequestHeaders.Add("My-Request-Header");
        logging.ResponseHeaders.Add("My-Response-Header");
        logging.MediaTypeOptions.AddText("application/javascript");
        logging.RequestBodyLogLimit = 4096;
        logging.ResponseBodyLogLimit = 4096;
    });
}

ResponseBodyLogLimit

Tamaño máximo del cuerpo de la respuesta para registrar, en bytes. El valor predeterminado es 32 KB.

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpLogging(logging =>
    {
        // Customize HTTP logging here.
        logging.LoggingFields = HttpLoggingFields.All;
        logging.RequestHeaders.Add("My-Request-Header");
        logging.ResponseHeaders.Add("My-Response-Header");
        logging.MediaTypeOptions.AddText("application/javascript");
        logging.RequestBodyLogLimit = 4096;
        logging.ResponseBodyLogLimit = 4096;
    });
}