IIS日志请求正文/ POST数据


Answers:


32

IIS仅记录查询字符串和标头信息,而没有任何POST数据。

如果使用的是IIS7,则可以为状态代码200启用“失败请求跟踪”。它将记录所有数据,并可以选择要包括的数据类型。

在IIS6或7中,可以在global.asax中使用Application_BeginRequest并创建自己的POST数据日志。

或者,在IIS7中,您可以使用自己的自定义日志记录编写HTTP模块。


+1-我非常喜欢您的答案,远胜于我的回答。我显然需要阅读失败的请求跟踪,因为我显然没有像我应该的那样使用IIS7。
埃文·安德森

您如何“选择要包括的数据类型”?
帕维尔·楚楚瓦

1
创建FRT规则时,向导的最后一步允许您选择要包括的数据。默认情况下包括所有内容。
Scott Forsyth-MVP 2012年

我一直在寻找IIS6的东西,但是遇到了这个链接,该链接表明高级日志记录是IIS7的附加选项。 iis.net/learn/extensions/advanced-logging-module/…–
andyknas

IIS“高级日志记录”日志表单帖子似乎没有出现(从Andyknas共享的URL中)。它提供了“客户端日志记录”选项,该选项将记录特定种类的帖子,但不是所有表单帖子,而OP似乎在要求这些帖子(我自己也很想知道。)
charlie arehart

8

在托管代码中,可以使用Response.AppendToLog方法。此方法会将数据追加到cs-uri-stem字段中-总长度最多为4100个字符(未记录)。如果超出该限制,则将已记录的值替换为“ ...”

例如,将以下内容添加到您的Global.asax文件中即可达到目的(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
            }
        }       
    }
}
 

1
截至此注释,限制不是4100,而是4KB,即4096。因此,需要对该代码进行一些修改,以正确记录POST数据> 4KB。
史蒂文五世

1
我必须添加HttpContext.Current.Request.InputStream.Position = 0; 在request.BinaryRead之前,否则它将返回空数组
alex440

3

尽管我知道这是一个古老的问题,但我发现这段代码完全满足了我的需要,一个带有完整请求标头和响应的文本文件,将其放入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);
}

这将为每个请求(包括图像)创建一个文本文件,因此请谨慎使用。我只用它来记录特定的帖子请求。


1

在您的web.config文件中尝试此操作以跟踪所有内容

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

但是请注意,FRT功能隐式限制了它创建的日志文件的数量(这是一件好事),因此您需要在UI或通过配置文件条目中进行更改-并应谨慎选择即使是适度的Web应用程序也会创建的日志。
查理·阿瑞哈特

0

尽管我尚未尝试过,但这看起来令人鼓舞:

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

这与此处提供的其他选项(在global.asax.cs中包含代码)有何不同?这仅适用于ASP.NET页面请求,不适用于IIS可能处理的其他页面(php,cgi,jsp,cfml)。我共享的链接指向一个模块,该模块可以在IIS中为任何站点(或服务器级别)启用以处理任何类型的请求。


-4

尝试在IIS日志设置中启用以下功能:

方法(cs方法)

URI干(cs-uri-stem)

URI查询(cs-uri-query)


我已经尝试过,没有帮助... :(
布达

3
这些设置将不包括POST数据
抢劫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.