IIS लॉग अनुरोध बॉडी / पोस्ट डेटा


33

क्या किसी को पता है कि मैं पोस्ट डेटा या संपूर्ण HTTP अनुरोध लॉग करने के लिए IIS कैसे प्राप्त कर सकता हूं?


ModSecurity IIS7 + के लिए उपलब्ध है । यह अनुरोध और प्रतिक्रिया दोनों के हेडर और शरीर तक पूरी पहुंच की अनुमति देगा।
user2320464

जवाबों:


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

यह प्रकट नहीं होता है (उस url Andyknas से साझा) जो IIS "उन्नत लॉगिंग" लॉग पोस्ट बनाता है। यह "क्लाइंट लॉगिंग" के लिए एक विकल्प प्रदान करता है, जो एक विशेष प्रकार के पदों को लॉग करेगा, लेकिन सभी फॉर्म पोस्ट नहीं, जिसे ओपी अनुरोध कर रहा है (और मैं खुद के बारे में सोच रहा था।)
charlie arehart

8

प्रबंधित कोड में आप Response.AppendToLog विधि का उपयोग कर सकते हैं। यह विधि सीएस-यूरी-स्टेम क्षेत्र में डेटा को जोड़ देगी - कुल लंबाई 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 से पहले, अन्यथा यह खाली सरणी
लौटाएगा

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>

लेकिन ध्यान दें कि एफआरटी फ़ीचर, इसे बनाने वाली लॉग फ़ाइलों की संख्या को सीमित करता है (जो कि एक अच्छी बात है), इसलिए आपको इसे बदलने की आवश्यकता होगी, या तो यूआई में या कॉन्फिग फ़ाइल प्रविष्टियों के माध्यम से - और इसकी मात्रा के लिए उचित सावधानी के साथ लॉग जो एक मामूली वेब ऐप में भी बनाए जाएंगे।
चार्ली

0

यह उत्साहजनक लगता है, हालाँकि मैंने अभी तक इसकी कोशिश नहीं की है:

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

यह वैश्विक.सैक्स. कोड में कोड के साथ यहां दिए गए अन्य विकल्प से कैसे भिन्न है? यह केवल ASP.NET पृष्ठ अनुरोधों के लिए काम करेगा, न कि अन्य पृष्ठ IIS प्रक्रिया (php, cgi, jsp, cfml) की प्रक्रिया कर सकते हैं। मैंने जो लिंक साझा किया है वह एक ऐसे मॉड्यूल के लिए है जो किसी भी प्रकार के अनुरोध के लिए संसाधित करने के लिए किसी भी साइट (या सर्वर स्तर पर) के लिए IIS में सक्षम हो सकता है।


-4

अपनी IIS लॉग सेटिंग्स में निम्नलिखित को सक्षम करने का प्रयास करें:

विधि (सीएस-विधि)

यूआरआई स्टेम (सीएसआई-यूरी-स्टेम)

यूआरआई क्वेरी (सीएस-यूआरआई-क्वेरी)


मैंने कोशिश की है, मदद नहीं की है ... :(
बुद्धा

3
उन सेटिंग्स पोस्ट डेटा शामिल नहीं होगा
लूटने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.