web-dev-qa-db-ja.com

IIS Log Request Body / POSTデータ

IIS to log POSTデータまたはHTTPリクエスト全体を取得する方法を誰かが知っていますか?

35
Jim

IISは、POSTデータなしで、レコードのクエリ文字列とヘッダー情報のみをログに記録します。

IIS7を使用している場合は、ステータスコード200のFailed Request Tracingを有効にできます。これにより、すべてのデータが記録され、含めるデータのタイプを選択できます。

IIS6または7では、global.asaxでApplication_BeginRequestを使用して、POSTデータの独自のログを作成できます。

または、IIS7では、独自のカスタムログを使用してHTTPモジュールを作成できます。

33

マネージコードでは、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
            }
        }       
    }
} 
 
8

これは古い質問であると思いますが、このコードは私が必要とするものを正確に提供してくれることを発見しました。完全なリクエストヘッダーとレスポンスを含むテキストファイルを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);
}

これにより、すべてのリクエスト(画像を含む)ごとにテキストファイルが作成されるので、使用する場所に注意してください。特定の投稿リクエストをログに記録するためにのみ使用しました。

4
Terry Kernan

すべてをトレースするには、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>
2
DeepSpace101

私はまだ試していませんが、これは有望に見えます。

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任意のサイト(またはサーバーレベル)で任意のタイプの要求を処理するため。

0
charlie arehart