W3CLogger en ASP.NET Core

W3CLogger es un middleware que escribe archivos de registro en el formato estándar W3C. Los registros contienen información sobre las solicitudes y respuestas HTTP. W3CLogger proporciona registros de lo siguiente:

  • Información de solicitud HTTP
  • Propiedades comunes
  • Encabezados
  • Información de respuesta HTTP
  • Metadatos sobre el par de solicitud y respuesta (fecha y hora de inicio, tiempo empleado)

W3CLogger 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.

W3CLogger puede reducir el rendimiento de una aplicación. Tenga en cuenta el impacto en el rendimiento al seleccionar los campos que se van a registrar; la reducción del rendimiento aumentará a medida que registre más propiedades. Pruebe cómo inciden en el rendimiento las propiedades de registro seleccionadas.

Advertencia

W3CLogger puede registrar potencialmente información de identificación personal (DCP). Tenga en cuenta el riesgo y evite registrar información confidencial. De forma predeterminada, no se registran los campos que podrían contener DCP.

Habilitación de W3CLogger

W3CLogger está habilitado con UseW3CLogging, que agrega el middleware W3CLogger.

app.UseW3CLogging();

app.UseRouting();

app.MapGet("/", () => "Hello World!");

app.Run();

De forma predeterminada, W3CLogger registra propiedades comunes como la ruta de acceso, el código de estado, la fecha, la hora y el protocolo. Toda la información sobre un único par de solicitud/respuesta se escribe en la misma línea.

#Version: 1.0
#Start-Date: 2021-09-29 22:18:28
#Fields: date time c-ip s-computername s-ip s-port cs-method cs-uri-stem cs-uri-query sc-status time-taken cs-version cs-host cs(User-Agent) cs(Referer)
2021-09-29 22:18:28 ::1 DESKTOP-LH3TLTA ::1 5000 GET / - 200 59.9171 HTTP/1.1 localhost:5000 Mozilla/5.0+(Windows+NT+10.0;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/93.0.4577.82+Safari/537.36 -
2021-09-29 22:18:28 ::1 DESKTOP-LH3TLTA ::1 5000 GET / - 200 0.1802 HTTP/1.1 localhost:5000 Mozilla/5.0+(Windows+NT+10.0;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/93.0.4577.82+Safari/537.36 -
2021-09-29 22:18:30 ::1 DESKTOP-LH3TLTA ::1 5000 GET / - 200 0.0966 HTTP/1.1 localhost:5000 Mozilla/5.0+(Windows+NT+10.0;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/93.0.4577.82+Safari/537.36 -

Opciones de W3CLogger

Para configurar el middleware de W3CLogger, llame a AddW3CLogging en ConfigureServices.

builder.Services.AddW3CLogging(logging =>
{
    // Log all W3C fields
    logging.LoggingFields = W3CLoggingFields.All;
    
    logging.FileSizeLimit = 5 * 1024 * 1024;
    logging.RetainedFileCountLimit = 2;
    logging.FileName = "MyLogFile";
    logging.LogDirectory = @"C:\logs";
    logging.FlushInterval = TimeSpan.FromSeconds(2);
});

LoggingFields

W3CLoggerOptions.LoggingFields es una enumeración de marca de bits que configura partes específicas de la solicitud y respuesta al registro, y otra información sobre la conexión. LoggingFields incluye como valor predeterminado todos los campos posibles, excepto UserName y Cookie.

builder.Services.AddW3CLogging(logging =>
{
    // Log all W3C fields
    logging.LoggingFields = W3CLoggingFields.All;
    
    logging.FileSizeLimit = 5 * 1024 * 1024;
    logging.RetainedFileCountLimit = 2;
    logging.FileName = "MyLogFile";
    logging.LogDirectory = @"C:\logs";
    logging.FlushInterval = TimeSpan.FromSeconds(2);
});
Marca Descripción Value
Ninguno Sin registro. 0x0
Date Fecha en que se produjo la actividad. 0x1
Time Hora en que se produjo la actividad. 0x2
ClientIpAddress Dirección IP del cliente que accedió al servidor. 0x4
UserName Nombre del usuario autenticado que obtuvo acceso al servidor. 0x8
ServerName Nombre del servidor en el que se generó la entrada del registro. 0x10
ServerIpAddress Dirección IP del servidor en el que se generó la entrada del registro. 0x20
ServerPort Número de puerto al que está conectado el cliente. 0x40
Method Method de solicitud. 0x80
UriStem Ruta de acceso de solicitud, que incluye Path y PathBase. 0x100
UriQuery QueryString de solicitud. 0x200
ProtocolStatus StatusCode de respuesta. 0x400
TimeTaken Duración del tiempo, en milisegundos, que consumió la acción. 0x800
ProtocolVersion Protocol de solicitud. 0x1000
Host Microsoft.AspNetCore.Http.Headers.HeaderNames.Host de solicitud. 0x2000
UserAgent Microsoft.AspNetCore.Http.Headers.HeaderNames.UserAgent de solicitud. 0x4000
Cookie Microsoft.AspNetCore.Http.Headers.HeaderNames.Cookie de solicitud. 0x8000
Referer Microsoft.AspNetCore.Http.Headers.HeaderNames.Referer de solicitud. 0x10000
ConnectionInfoFields Marca para registrar una colección de propiedades, sobre la conexión HTTP, incluidas ClientIpAddress, ServerIpAddress y ServerPort. ClientIpAddress | ServerIpAddress | ServerPort
RequestHeaders Marca para registrar una colección de encabezados de solicitud, incluidos Host, Referer y UserAgent. Host | Referer | UserAgent
Request Marca para registrar una colección de propiedades sobre la solicitud, incluidas UriStem, UriQuery, ProtocolVersion, Method y RequestHeaders. UriStem | UriQuery | ProtocolVersion | Method | RequestHeaders
All Marca para registrar todos los campos posibles. Date | Time | ServerName | Method | UriStem | UriQuery | ProtocolStatus | TimeTaken | ProtocolVersion | Host | UserAgent | Referer | ConnectionInfoFields | UserName | Cookie

FileSizeLimit

Tamaño máximo del archivo de registro en bytes. El valor predeterminado es 10 MB.

builder.Services.AddW3CLogging(logging =>
{
    // Log all W3C fields
    logging.LoggingFields = W3CLoggingFields.All;
    
    logging.FileSizeLimit = 5 * 1024 * 1024;
    logging.RetainedFileCountLimit = 2;
    logging.FileName = "MyLogFile";
    logging.LogDirectory = @"C:\logs";
    logging.FlushInterval = TimeSpan.FromSeconds(2);
});

RetainedFileCountLimit

Número máximo de archivos que se mantienen en el disco antes de la instalación, por aplicación. El valor predeterminado es 4, con un límite de 10 000.

builder.Services.AddW3CLogging(logging =>
{
    // Log all W3C fields
    logging.LoggingFields = W3CLoggingFields.All;
    
    logging.FileSizeLimit = 5 * 1024 * 1024;
    logging.RetainedFileCountLimit = 2;
    logging.FileName = "MyLogFile";
    logging.LogDirectory = @"C:\logs";
    logging.FlushInterval = TimeSpan.FromSeconds(2);
});

FileName

Prefijo que se usará para el nombre del archivo de registro. Se anexará la fecha actual más un número de archivo, con el formato {YYYYMMDD.X}.

builder.Services.AddW3CLogging(logging =>
{
    // Log all W3C fields
    logging.LoggingFields = W3CLoggingFields.All;
    
    logging.FileSizeLimit = 5 * 1024 * 1024;
    logging.RetainedFileCountLimit = 2;
    logging.FileName = "MyLogFile";
    logging.LogDirectory = @"C:\logs";
    logging.FlushInterval = TimeSpan.FromSeconds(2);
});

LogDirectory

Directorio en el que se escribirá el archivo de registro. El valor predeterminado es ./logs/, en relación con el directorio de la aplicación.

builder.Services.AddW3CLogging(logging =>
{
    // Log all W3C fields
    logging.LoggingFields = W3CLoggingFields.All;
    
    logging.FileSizeLimit = 5 * 1024 * 1024;
    logging.RetainedFileCountLimit = 2;
    logging.FileName = "MyLogFile";
    logging.LogDirectory = @"C:\logs";
    logging.FlushInterval = TimeSpan.FromSeconds(2);
});

FlushInterval

El período tras el cual se vaciará el archivo de registro. El valor predeterminado es 1 segundo.

builder.Services.AddW3CLogging(logging =>
{
    // Log all W3C fields
    logging.LoggingFields = W3CLoggingFields.All;
    
    logging.FileSizeLimit = 5 * 1024 * 1024;
    logging.RetainedFileCountLimit = 2;
    logging.FileName = "MyLogFile";
    logging.LogDirectory = @"C:\logs";
    logging.FlushInterval = TimeSpan.FromSeconds(2);
});