दिलचस्प पोस्ट
पायथन में एक ज्ञात संख्या में तत्वों की सूची शुरू करना OBJMTLLoader के माध्यम से लोड ऑब्जेक्ट पर तीन। जेएस एकाधिक सामग्री iPhone 6 प्लस संकल्प भ्रम: Xcode या ऐप्पल की वेबसाइट? विकास के लिए तंत्रिका नेटवर्क में ट्रेन, सत्यापन और परीक्षण सेट के बीच क्या अंतर है? कॉलबैक फ़ंक्शन के लिए अभिभावकीय क्षेत्र में वैरिएबल पास करना मैं एक पायथन समारोह का स्रोत कोड कैसे प्राप्त करूं? आपके लिनक्स मशीन पर लिबस्टडीसी ++ लाइब्रेरी का कौन सा संस्करण स्थापित है आप कैसे पता लगा सकते हैं? किसी पृष्ठ में एक स्क्रिप्ट टैग का स्थान कैसे एक जावास्क्रिप्ट फ़ंक्शन को प्रभावित करता है जो इसे परिभाषित करता है? फ़ायरबेज में प्राथमिकता का क्या अर्थ है? पृष्ठ दिखाना बंद करें मॉनिट के साथ विलंब से काम करने के लिए कैसे काम करें कंटेनर व्यू नियंत्रक उदाहरण एनएसएटीयूटिवर्डिंग पृष्ठभूमि रंग और गोलाकार कोनों आर में दो कॉलम की आवृत्ति संख्या क्या आप स्ट्रिंग स्प्लिट में शून्य-चौराहे मिलान वाले regex का उपयोग कर सकते हैं?

लॉग4नेट के साथ उपयोगकर्ता नाम पर कब्जा

मैं वर्तमान में एक डेटाबेस में सभी लॉग4नेट इवेंट लिखता हूं, और यह ठीक काम करता है। लॉग इन उपयोगकर्ता खाते को कैप्चर करने के लिए मैं इस कोड का उपयोग करता हूं:

HttpContext context = HttpContext.Current; if (context != null && context.User != null && context.User.Identity.IsAuthenticated) { MDC.Set("user", HttpContext.Current.User.Identity.Name); } 

कोड ठीक लगता है, उन घटनाओं को छोड़कर, जिनके साथ कोई उपयोगकर्ता संदर्भ नहीं है (हमारे सार्वजनिक वेब पृष्ठ पर एक उपयोगकर्ता)। उस मामले में log4net कैप्चर कुछ समय पहले पिछले लॉग इन उपयोगकर्ता खाते को लिखता है (बुरा) और कुछ समय में एक रिक्त (अच्छा) लिखना किसी भी व्यक्ति को सभी मामलों में मज़बूती से काम करने के लिए यह सुविधा मिली? मेरा मानना ​​है कि मैंने एक नोट देखा है कि एमडीसी अब उपयोग करने के लिए एक अनुशंसित सुविधा नहीं है, लेकिन मुझे कोई भी विकल्प नहीं मिल पा रहा है जो अनुशंसित हैं।

नोट: मुझे यह अजीब लगता है कि एमडीसी एक खाता नाम के साथ सेट है, लेकिन कभी भी साफ़ नहीं होता है कि कोई उपयोगकर्ता सक्रिय नहीं है। यह समस्या का हिस्सा हो सकता है हालांकि, मुझे कोई भी एमडीसी कोड निष्कर्ष नहीं मिला जो यूज़रनेम को साफ़ भी कर सके।

Solutions Collecting From Web of "लॉग4नेट के साथ उपयोगकर्ता नाम पर कब्जा"

यदि एचटीटीपीएन्टेक्सटेक्स्ट में उपलब्ध जानकारी पर्याप्त है, तो यह है कि यदि आपने पोस्ट किया गया नमूना कोड आपको सही उत्तर देता है (एमडीसी मुद्दे को छोड़कर) और आप बस लिखना नहीं चाहते हैं:

 HttpContext context = HttpContext.Current; if (context != null && context.User != null && context.User.Identity.IsAuthenticated) { MDC.Set("user", HttpContext.Current.User.Identity.Name); } 

तो अक्सर, तब आप log4net के लिए अपना स्वयं का कस्टम PatternLayoutConverter लिखकर "लॉग" में अपने नाम को जोड़ सकते हैं। वे बहुत आसानी से लिखते हैं और आप उन्हें अपने लॉग4नेट लॉगिंग कॉन्फ़िगरेशन में कॉन्फ़िगर कर सकते हैं जैसे निर्मित में हैं

एक कस्टम PatternLayoutConverter लिखने के एक उदाहरण के लिए यह प्रश्न देखें:

कस्टम लॉग 4 नेट प्रॉपर्टी पैटर्न लॉयआउट कॉओलेटर (इंडेक्स के साथ)

उस लिंक पर उदाहरण का प्रयोग करके, आप ऐसा कुछ करने में सक्षम हो सकते हैं:

 namespace Log4NetTest { class HttpContextUserPatternConverter : PatternLayoutConverter { protected override void Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent) { string name = ""; HttpContext context = HttpContext.Current; if (context != null && context.User != null && context.User.Identity.IsAuthenticated) { name = context.User.Identity.Name; } writer.Write(name); } } } 

आप इसे इस तरह लॉग4net में कॉन्फ़िगर करेंगे:

  //Log HttpContext.Current.User.Identity.Name <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p [User = %HTTPUser] %m%n"/> <converter> <name value="HTTPUser" /> <type value="Log4NetTest.HttpContextUserPatternConverter" /> </converter> </layout> 

इसके अलावा, आप एचटीटीपीटीओएनसीटीएक्स। कॉरेंट.आईटीम्स या एचटीटीपीसीओएनटीएक्स.कंट्रेंट सशन कलेक्शन से एक विशेष आइटम को खींचने के लिए ऑप्शन पैरामीटर (ऊपर दिए गए लिंक का उदाहरण देखें) का उपयोग करने वाले अन्य पैटर्न कनवर्टर बना सकते हैं।

कुछ इस तरह:

 namespace Log4NetTest { class HttpContextSessionPatternConverter : PatternLayoutConverter { protected override void Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent) { //Use the value in Option as a key into HttpContext.Current.Session string setting = ""; HttpContext context = HttpContext.Current; if (context != null) { object sessionItem; sessionItem = context.Session[Option]; if (sessionItem != null) { setting = sessionItem.ToString(); } writer.Write(setting); } } } } namespace Log4NetTest { class HttpContextItemPatternConverter : PatternLayoutConverter { protected override void Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent) { //Use the value in Option as a key into HttpContext.Current.Session string setting = ""; HttpContext context = HttpContext.Current; if (context != null) { object item; item = context.Items[Option]; if (item != null) { setting = item.ToString(); } writer.Write(setting); } } } } 

आपको ये लिंक उपयोगी भी मिल सकते हैं:

http://piers7.blogspot.com/2005/12/log4net-context-problems-with-aspnet.html

यहां, ब्लॉगर एचटीपीपीएनटीएक्स से मैं जो प्रस्तावित है उससे मूल्यों को दर्ज करने का एक अलग समाधान प्रस्तावित करता है। समस्या का वर्णन और उसके समाधान के लिए ब्लॉग पोस्ट पढ़ें। समाधान को संक्षेप करने के लिए, वह ग्लोबलडिग्नॉस्टोस्टिक कंसटेक्स (MDC के लिए और अधिक आधुनिक नाम) में किसी वस्तु को संग्रहीत करता है। जब log4net ऑब्जेक्ट का मान लॉग करता है तो यह ToString () का उपयोग करता है अपने ऑब्जेक्ट के कार्यान्वयन से एचटीटीपीटीन्टेक्स से एक मूल्य प्राप्त होता है:

तो, आप ऐसा कुछ कर सकते हैं:

 public class HttpContextUserNameProvider { public override string ToString() { HttpContext context = HttpContext.Current; if (context != null && context.User != null && context.User.Identity.IsAuthenticated) { return context.Identity.Name; } return ""; } } 

आप अपने ऑब्जेक्ट का एक उदाहरण GlobalDiagnosticContext (एमडीसी) में अपने कार्यक्रम की शुरुआत कर सकते हैं और यह हमेशा सही मान वापस करेगा क्योंकि यह HttpContext.Current तक पहुंच रहा है।

 MDC.Set("user", new HttpContextUserNameProvider()); 

यह मेरी प्रस्तावित की तुलना में बहुत आसान लगता है!

पूर्णता के लिए, अगर किसी को एनओओजी में एक ही चीज़ कैसे करना है, यह जानना चाहता है, तो एनओएलजी अपने "aspnet- *" लेआउट रेंडरर्स के माध्यम से सबसे अधिक / सभी एचटीटीपीकॉन्टेक्स्ट जानकारी उपलब्ध कराती है:

https://github.com/nlog/nlog/wiki/Layout-Renderers

Log4Net आधिकारिक API डॉक्स के अनुसार, एमडीसी को बहिष्कृत किया गया है:

उस MDC.Set से MDC.Set केवल मानों के रूप में तार स्वीकार करते हैं, इसलिए @ वाजेगोहे का अंतिम समाधान काम नहीं कर सकता (जो कि एचटीपीपीटीएक्सटीएसयूएन नामक प्रदाता का उपयोग करता है)

मेरा समाधान log4net.GlobalContext साथ HttpContextUserNameProvider का उपयोग करने के लिए किया गया है। log4net.GlobalContext , आधिकारिक API दस्तावेज़ों में भी सुझाव दिया गया है:

  • Log4net आरंभीकरण के बाद यह तात्कालिकता जोड़ें (उदाहरण के लिए Global.Application_Start में)

     log4net.GlobalContext.Properties["user"] = new HttpContextUserNameProvider(); 
  • इस वर्ग को जोड़ें

     public class HttpContextUserNameProvider { public override string ToString() { HttpContext context = HttpContext.Current; if (context != null && context.User != null && context.User.Identity.IsAuthenticated) { return context.User.Identity.Name; } return ""; } } 
  • उदाहरण के लिए "उपयोगकर्ता" गुण मूल्य जोड़ कर लॉग4नेट कॉन्फ़िगरेशन को संशोधित करें:

     <layout type="log4net.Layout.PatternLayout" value="%property{user}"/> 

Log4Net संस्करण 1.2.11 के रूप में अब आप एएसपी .नेट अनुरोध के माध्यम से प्राधिकृत उपयोगकर्ता को प्राप्त करने के लिए एपेन्डर पैटर्न का उपयोग कर सकते हैं।

 %aspnet-request{AUTH_USER} 

यह शुद्ध अटकलें हैं, लेकिन यह बहुत ज्यादा लगता है जैसे यह साझा अनुरोध धागे से संबंधित एक मुद्दा हो सकता है अर्थात थ्रेडपुल धागे। जब आप एक MDC मान सेट करते हैं तो यह वर्तमान धागा से जुड़ा होता है, और उस थ्रेड को अनुरोध के अंत में थ्रेडपूल में वापस किया जाएगा और फिर बाद के अनुरोधों के लिए फिर से उपयोग किया जाएगा। यदि मूल्य ओवरराइट नहीं किया गया है, तो आप नए अनुरोधों पर पुराने मान देख सकते हैं

अनुरोध के प्रारंभ और समापन ईवेंट में इस डेटा को प्रबंधित करने पर विचार करें, जहां आप एक अनुरोध शुरू होने पर उपयोगकर्ता नाम सेट कर सकते हैं, और फिर अनुरोध के अंत पर उसे साफ़ कर सकते हैं। इसे इस डेटा को जीवन भर के जीवनकाल के लिए अनुरोध करना चाहिए।

क्या आप %identity और %username चाहते हैं के दो अलग-अलग तरीके हैं

उनको आपके एपेन्डर पैटर्न में इस्तेमाल किया जा सकता है

मैंने यह पहले किया है लेकिन अप्रत्याशित परिणाम के साथ जब तक मैं निम्नलिखित पोस्ट पढ़ता हूं जो इसे मेरे लिए साफ़ कर देता है

यह पोस्टिंग देखें: जब मैं अपने ऐपेंडर में फ़ाइल को नाम देता है Log4Net% उपयोगकर्ता नाम का पता नहीं लगा सकता है

मैंने मेज़ेघे और गियान मार्को गेहरार्डी के समाधान का उपयोग किया है, लेकिन ग्लोबलकॉन्टेक्स्ट के बजाय संदेश को लॉग करने से पहले थ्रेड संदर्भ को सेट किया है:

 ThreadContext.Properties["user"] = new HttpContextUserNameProvider();