2012-03-14 57 views
9

मैं अपने एएसपी.NET वेब साइट के लॉग संदेशों को लॉग इन करने के लिए log4net का उपयोग कर रहा हूं, और हाल ही में मैं पेज/हैंडलर के बारे में जानकारी जोड़ना चाहता था जहां त्रुटि हुई। इसलिए मैं Global.asax में निम्न पंक्ति जोड़ने का निर्णय लिया:एएसपी.NET अनुरोध के लिए विशिष्ट log4net संदर्भ गुण कैसे सेट करें?

void Application_BeginRequest(object sender, EventArgs e) 
{ 
    log4net.ThreadContext.Properties["page"] = HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath; 
} 

और की तरह बुद्धिमान मैंने अपना रूपांतरण पैटर्न के लिए %property{page} कहा:

<conversionPattern value="%newline%date %-5level %property{page} - %message%newline%newline%newline" /> 

यह एकल अनुरोधों के लिए ठीक काम किया। लेकिन फिर मैंने अपने लॉग में देखा कि पृष्ठ संपत्ति एएसपी.NET अनुरोध के दौरान बदल सकती है। मैंने एक एएसएचएक्स हैंडलर में लॉगिंग कर ली है, और इसके प्रसंस्करण के बीच में, पृष्ठ की संपत्ति एक अलग मूल्य में बदल जाएगी जो एएसपीएक्स पेज को इंगित करती है। मैंने निष्कर्ष निकाला कि एएसपी.नेट पर एक और अनुरोध आ रहा है और इसके BeginRequest को निष्पादित किया गया है और log4net.ThreadContext में स्थिर पृष्ठ संपत्ति को दूसरे मान में बदल दिया गया है।

अब, मैं प्रति अनुरोध पृष्ठ संपत्ति को बनाए रखना चाहता हूं, ताकि मेरे पास लगातार लॉग इन करने वाले निष्पादन पृष्ठ का मार्ग हो। मैंने जवाब खोजने की कोशिश की, लेकिन मैं कुछ भी नहीं मिला। इस समस्या को हल करने के लिए अनुशंसित तरीका क्या है? मुझे यकीन है कि यह वेब सर्वर इवेंट लॉगिंग की बहुत ही बुनियादी कार्यक्षमता है।

उत्तर

20

एएसपी.NET does not guarantee के बाद से पूरे पृष्ठ अनुरोध को उसी थ्रेड पर संसाधित किया जाएगा, मैं HttpContext.Current as log4net processes लॉगिंग ईवेंट से उत्तर प्राप्त करना पसंद करता हूं।

निम्नलिखित GetCurrentPage वर्ग को लागू करता है क्या log4net पुस्तिका इसकी ToString विधि अधिभावी द्वारा एक "Active Property Value" कॉल:

public class GetCurrentPage 
{ 
    public override string ToString() 
    { 
     if (null != HttpContext.Current) 
     { 
      return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath; 
     } 
     return string.Empty; // or "[No Page]" if you prefer 
    } 
} 

रजिस्टर Global.asax के Application_Start में इस वर्ग के log4net के GlobalContext में।

protected void Application_Start(object sender, EventArgs e) 
{ 
    XmlConfigurator.Configure(); 
    GlobalContext.Properties["page"] = new GetCurrentPage(); 
} 

जब log4net लाइन यह जो वर्तमान अनुरोध में मूल्य देखने जाएगा हमारे GetCurrentPage वर्ग के ToString विधि कहेंगे %property{page} हिस्सा लिखते हैं।

+2

यह प्रतिभा है। –

2

क्या आपने इस आलेख में उल्लिखित अनुप्रयोग_BeginRequest के बजाय Application_PostAcquireRequestState का उपयोग करने का प्रयास किया है? How can I include SessionID in log files using log4net in ASP.NET?

हम प्रवेश करने के लिए पृष्ठ जोड़ने के बाद से हम विधि नाम के साथ प्रत्येक वर्ग में हमारे लकड़हारा बनाने की आवश्यकता महसूस नहीं की है:

private static new readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

और इस तरह एक रूपांतरण पैटर्न:

<conversionPattern value="%date %P{user} %P{addr} [%property{SessionID}] %level %logger - %message%newline" /> 

तो हम लॉग आउटपुट में कक्षा का नाम देखकर समाप्त होते हैं। यह आपको अलग-अलग करने देता है कि लॉगिंग पेज क्लास फ़ाइल में ही होती है, बनाम एक बेस क्लास जिसे वह प्राप्त करता है। जब कोड बेस क्लास में निष्पादित हो रहा है तब भी आपके समाधान का पृष्ठ नाम दिखाने का लाभ होगा। मुझे लगता है कि हम अपने सेटअप में {पेज} जोड़ने पर विचार करेंगे।

+0

दिलचस्प बात यह है इस काम करता है का पता लगाएं। BeginRequest को असीमित रूप से निष्पादित किया जाता है, लेकिन Application_PostAcquireRequestState को किसी पृष्ठ अनुरोध की शुरुआत में संसाधित किया जाता है, जिसके बाद अन्य सभी पृष्ठ ईवेंट सिंक्रनाइज़ेशन से निकाल दिए जाते हैं, और दूसरा पृष्ठ अनुरोध पहले तक समाप्त होने तक प्रतीक्षा करनी चाहिए। –

+0

@CraigA मुझे नहीं लगता कि आपकी कोड लाइन 'निजी स्थैतिक नए readonly log4net.ILog' में 'नया' ऑपरेटर की आवश्यकता है। इसे संपादित और हटा नहीं सकता है, क्योंकि एसओ कहता है "संपादन कम से कम 6 अक्षर होना चाहिए" :)। –

0

एएसपी में स्टोर संपत्ति मूल्य।नेट संदर्भ HttpContext.Current.Items.Add("yourProperty", value) यह log4net लेआउट से उपलब्ध हो जाएगा:

<layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%aspnet-context{yourProperty}" /> 
</layout> 

अधिक विस्तार here.