IIS Log Request Body / POST Data

Respuestas:

32

Los registros de IIS solo registran la cadena de consulta y la información del encabezado sin ningún dato POST.

Si está utilizando IIS7, puede habilitar el seguimiento de solicitudes fallidas para el código de estado 200. Eso registrará todos los datos y podrá seleccionar qué tipo de datos incluir.

En IIS6 o 7, puede usar Application_BeginRequest en global.asax y crear su propio registro de datos POST.

O, en IIS7, puede escribir un Módulo HTTP con su propio registro personalizado.

Scott Forsyth - MVP
fuente
+1 - Me gusta tu respuesta mucho, mucho mejor que la mía. Claramente necesito leer sobre el seguimiento de solicitudes fallidas, ya que obviamente no he usado IIS7 tanto como debería.
Evan Anderson, el
¿Cómo puede "seleccionar qué tipo de datos incluir"?
Pavel Chuchuva el
1
El último paso del asistente al crear una regla FRT le permite seleccionar qué datos incluir. El valor predeterminado es incluir todo.
Scott Forsyth - MVP
Estaba buscando algo para IIS6 pero encontré este enlace que muestra que el registro avanzado es una opción adicional para IIS7. iis.net/learn/extensions/advanced-logging-module/…
andyknas
No parece (de esa url que Andyknas compartió) que los registros de "registro avanzado" de IIS formen publicaciones. Ofrece una opción para "registro de clientes", que registraría publicaciones de un tipo particular, pero no todas las publicaciones de formulario, que el OP parece estar solicitando (y me preguntaba sobre mí mismo)
Charlie Arehart
8

En el código administrado, puede usar el método Response.AppendToLog. Este método agregará datos al campo cs-uri-stem; la longitud total es de hasta 4100 caracteres (sin documentar). Si excede ese límite, el valor que se habría registrado se reemplaza con "..."

Por ejemplo, agregar algo como esto a su archivo Global.asax debería hacer el truco (C #):

void Application_EndRequest(Object Sender, EventArgs e)
{
    if( "POST" == Request.HttpMethod )
    {
        byte[] bytes    = Request.BinaryRead(Request.TotalBytes);
        string s    = Encoding.UTF8.GetString(bytes);
        if (!String.IsNullOrEmpty(s))
        {
            int QueryStringLength = 0;
            if (0 < Request.QueryString.Count)
            {
                QueryStringLength = Request.ServerVariables["QUERY_STRING"].Length;
                Response.AppendToLog( "&" );
            }

            if (4100 > ( QueryStringLength + s.Length ) )
            {
                Response.AppendToLog(s);
            }
            else
            {
                // append only the first 4090 the limit is a total of 4100 char.
                Response.AppendToLog(s.Substring(0, ( 4090 - QueryStringLength )));
                // indicate buffer exceeded
                Response.AppendToLog("|||...|||");
                // TODO: if s.Length >; 4000 then log to separate file
            }
        }       
    }
}
 
Geoffrey McGrath
fuente
1
A partir de este comentario, el límite no es 4100, es 4KB, que es 4096. Por lo tanto, este código debe modificarse ligeramente para registrar datos POST> 4KB correctamente.
Steven V
1
Tuve que agregar HttpContext.Current.Request.InputStream.Position = 0; antes de request.BinaryRead, de lo contrario devolvería una matriz vacía
alex440
3

Si bien aprecio que esta es una pregunta anterior, descubrí que este código me dio exactamente lo que necesitaba, un archivo de texto con los encabezados de solicitud completos y la respuesta, lo puso en su global.asax.cs:

protected void Application_BeginRequest(Object Sender, EventArgs e)
{
    string uniqueid = DateTime.Now.Ticks.ToString();
    string logfile = String.Format("C:\\path\\to\\folder\\requests\\{0}.txt", uniqueid);
    Request.SaveAs(logfile, true);
}

Esto creará un archivo de texto para todas y cada una de las solicitudes (incluidas las imágenes), así que tenga cuidado donde lo use. Solo lo usé para registrar solicitudes de publicación específicas.

Terry Kernan
fuente
1

Pruebe esto en su archivo web.config para rastrear todo

<tracing>
  <traceFailedRequests>
    <remove path="*" />
    <add path="*">
      <traceAreas>
        <add provider="ASP" verbosity="Verbose" />
        <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" />
        <add provider="ISAPI Extension" verbosity="Verbose" />
        <add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,FastCGI,WebSocket,Rewrite" verbosity="Verbose" />
      </traceAreas>
      <failureDefinitions timeTaken="00:00:00" statusCodes="200-999" />
    </add>
  </traceFailedRequests>
</tracing>
DeepSpace101
fuente
Pero tenga en cuenta que la función FRT limita implícitamente el número de archivos de registro que crea (lo cual es algo bueno), por lo que deberá cambiar eso, ya sea en la interfaz de usuario o mediante las entradas del archivo de configuración, y con la debida precaución para el volumen de registros que se crearían incluso en una aplicación web modesta.
Charlie Arehart
0

Esto parece alentador, aunque todavía no lo he probado:

https://www.codeproject.com/Tips/1213108/HttpModule-for-Logging-HTTP-POST-Data-in-IIS-Log

¿Cómo difiere esto de la otra opción ofrecida aquí, con código en global.asax.cs? Eso solo funcionaría para las solicitudes de página ASP.NET, no para otras páginas que IIS podría procesar (php, cgi, jsp, cfml). El enlace que compartí es a un módulo que uno podría habilitar en IIS para que cualquier sitio (o en el nivel del servidor) procese cualquier tipo de solicitud.

Charlie Arehart
fuente
-4

Intente habilitar lo siguiente en su configuración de registro de IIS:

Método (método cs)

Tallo URI (cs-uri-stem)

Consulta URI (cs-uri-query)

joeqwerty
fuente
Lo he intentado, no he ayudado ... :(
Budda
3
Esas configuraciones no incluirán datos POST
robar