IIS Günlük İsteği Gövde / POST Verileri


Yanıtlar:


32

IIS, POST verileri olmadan yalnızca kayıt sorgulama ve başlık bilgilerini kaydeder.

IIS7 kullanıyorsanız, durum kodu 200 için Başarısız İstek İzleme özelliğini etkinleştirebilirsiniz. Bu, tüm verileri kaydeder ve dahil edilecek verilerin türünü seçebilirsiniz.

IIS6 veya 7'de global.asax'ta Application_BeginRequest'i kullanabilir ve kendi POST verileri günlüğünüzü oluşturabilirsiniz.

Veya, IIS7'de kendi özel günlüğünüzle bir HTTP Modülü yazabilirsiniz.


+1 - Cevabınızı kendimden çok daha iyi seviyorum. Açıkça benim istediğim kadar IIS7 kullanmadığım için başarısız istek takibi okumam gerekiyor.
Evan Anderson,

"Hangi tür verileri içereceğini" nasıl seçebilirsiniz?
Pavel Chuchuva

1
Bir FRT kuralı oluştururken sihirbazın son adımı, eklenecek verileri seçmenize olanak sağlar. Her şeyi dahil etmek için varsayılandır.
Scott Forsyth - MVP

IIS6 için bir şeyler arıyordum ancak gelişmiş günlük kaydının IIS7 için bir eklenti seçeneği olduğunu gösteren bu bağlantıya rastladım. iis.net/learn/extensions/advanced-logging-module/…
andyknas 19:16

Görünüşe göre (bu URL Andyknas tarafından paylaşılan), IIS'nin "gelişmiş günlük kaydı" form gönderilerini günlüğe kaydetti. Bu, belirli bir sıralamadaki yazıların günlüğe kaydedilmesini sağlayacak, ancak OP'nin talep ettiği görünen form yazılarının tümünü değil (ve kendimi merak ediyordum.)
charlie arehart,

8

Yönetilen kodda Response.AppendToLog yöntemini kullanabilirsiniz. Bu yöntem cs-uri-stem alanına veri ekler - toplam uzunluk 4100 karaktere kadardır (belgesiz). Bu limiti aşarsanız, kaydedilmiş olan değer "..." ile değiştirilir.

Örneğin, Global.asax dosyanıza böyle bir şey eklemek hile yapmalı (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
Bu yorumdan itibaren, limit 4100 değil, 4096 olan 4KB'dir. Bu yüzden POST verilerini> 4KB doğru bir şekilde kaydetmek için bu kodun biraz değiştirilmesi gerekir.
Steven V

1
HttpContext.Current.Request.InputStream.Position = 0; eklemek zorunda kaldım. istek
önce.BinaryRead

3

Bunun eski bir soru olduğunu takdir etmeme rağmen, bu kodun bana tam ihtiyacım olan şeyi verdiğini, istek başlıklarının tamamını ve yanıtını içeren bir metin dosyasının global.asax.cs içine koyduğunu gördüm:

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);
}

Bu, her istek için (resimler dahil) bir metin dosyası oluşturacaktır, bu nedenle nerede kullandığınıza dikkat edin. Sadece belirli gönderi isteklerini kaydetmek için kullandım.


1

Her şeyi izlemek için bunu web.config dosyanızda deneyin

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

Ancak, FRT özelliğinin, oluşturduğu günlük dosyalarının sayısını (ki bu iyi bir şeydir) örtük olarak sınırladığını unutmayın; bu nedenle, kullanıcı arabiriminde veya config dosyası girişleriyle bunu değiştirmek zorunda kalacaksınız - mütevazı bir web uygulamasında bile oluşturulacak günlükler.
charlie arehart

0

Bu, henüz denememiş olmama rağmen, cesaret verici görünüyor:

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

Bu, global.asax.cs koduyla birlikte burada sunulan diğer seçeneklerden ne kadar farklıdır? Bu yalnızca ASP.NET sayfa istekleri için işe yarayacaktır, IIS'nin işleyebileceği diğer sayfalar (php, cgi, jsp, cfml) için geçerli değildir. Paylaştığım bağlantı, herhangi bir istek için herhangi bir sitenin (veya sunucu düzeyinde) IIS'de etkinleştirebileceği bir modüldür.


-4

IIS günlük ayarlarınızda aşağıdakileri etkinleştirmeyi deneyin:

Yöntem (cs-method)

URI Kök (cs-uri-stem)

URI Sorgusu (cs-uri-query)


Ben denedim, yardım etmedim ... :(
Budda

3
Bu ayarlar POST verilerini içermez
rob
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.