IISログリクエストボディ/ POSTデータ


回答:


32

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

IIS7を使用している場合は、ステータスコード200の失敗した要求トレースを有効にできます。これにより、すべてのデータが記録され、含めるデータの種類を選択できます。

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

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


+1-私はあなたの答えがはるかに好きです。私は明らかに、必要なほどIIS7を使用していないので、失敗した要求トレースについて明らかに読む必要があります。
エヴァンアンダーソン

どのように「含めるデータのタイプを選択する」ことができますか?
パベルチュチュヴァ

1
FRTルールを作成するときのウィザードの最後のステップでは、含めるデータを選択できます。デフォルトではすべてが含まれます。
スコットフォーサイス

IIS6の何かを探していましたが、IIS7のアドオンオプションである高度なログを示すこのリンクを見つけました。 iis.net/learn/extensions/advanced-logging-module/...
andyknas

IISの「高度なログ」がフォームの投稿をログに記録するようには見えません(Andyknasが共有したURLから)。これは、特定の種類のポストが記録されます「クライアントのログ記録」のためのオプションを提供していますが、OPが要求しているように見えるすべてのフォームポストは、(と私は自分自身、疑問を抱いた。)でない
チャーリーは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です。したがって、4KBを超えるPOSTデータを正しく記録するには、このコードをわずかに変更する必要があります。
スティーブンV 14年

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

URIステム(cs-uri-stem)

URIクエリ(cs-uri-query)


私は試しましたが、助けていない... :(
ブッダ

3
これらの設定は、POSTデータは含まれません
奪う
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.