मेरे पास AdoNetAppender का उपयोग कर डेटाबेस लॉगिंग है। मैं क्या करना चाहता हूं प्रत्येक लॉग स्टेटमेंट पर उपयोगकर्ता पहचान लॉग करें। हालांकि, मैं दो कारणों से मानक लॉग 4नेट% पहचान पैरामीटर का उपयोग नहीं करना चाहता:कस्टम पैरामीटर के साथ log4net डेटाबेस लॉगिंग
- log4net चेतावनी देता है कि इसकी संदर्भ धीमी है क्योंकि इसे संदर्भ पहचान को देखना है।
- कुछ सेवा घटकों में मानक पहचान एक सेवा खाता है लेकिन हमने पहले से ही एक चर में उपयोगकर्ता पहचान पर कब्जा कर लिया है और मैं इसका उपयोग करना चाहता हूं।
मैं कोड जहां कुछ लोगों को log4net.ThreadContext का उपयोग अतिरिक्त गुण जोड़ने के लिए देखा है, लेकिन मैं समझता हूँ कि इस सूत्र इंटरलिविंग की वजह से 'असुरक्षित' है (और यह भी एक प्रदर्शन नाली है)।
मेरे दृष्टिकोण AdoNetAppenderParameter वर्ग इस प्रकार का विस्तार करने में किया गया है:
public class UserAdoNetAppenderParameter : AdoNetAppenderParameter
{
public UserAdoNetAppenderParameter()
{
DbType = DbType.String;
PatternLayout layout = new PatternLayout();
Layout2RawLayoutAdapter converter = new Layout2RawLayoutAdapter(layout);
Layout = converter;
ParameterName = "@username";
Size = 255;
}
public override void Prepare(IDbCommand command)
{
command.Parameters.Add(this);
}
public override void FormatValue(IDbCommand command, LoggingEvent loggingEvent)
{
string[] data = loggingEvent.RenderedMessage.Split('~');
string username = data[0];
command.Parameters["@username"] = username;
}
}
और उसके बाद प्रोग्राम के रूप में इतनी तरह वर्तमान appender से जोड़ें:
ILog myLog = LogManager.GetLogger("ConnectionService");
IAppender[] appenders = myLog.Logger.Repository.GetAppenders();
AdoNetAppender appender = (AdoNetAppender)appenders[0];
appender.AddParameter(new UserAdoNetAppenderParameter());
myLog.InfoFormat("{0}~{1}~{2}~{3}", userName, "ClassName", "Class Method", "Message");
यहाँ इरादा एक मानक प्रारूप का उपयोग करने के लिए है संदेशों के लिए और स्ट्रिंग के पहले भाग को पार्स करें जो हमेशा उपयोगकर्ता नाम होना चाहिए। कस्टम एपेंडर पैरामीटर की FormatValue() विधि को स्ट्रिंग के केवल उस हिस्से का उपयोग करना चाहिए ताकि इसे लॉग डेटाबेस में एक अलग फ़ील्ड में लिखा जा सके।
मेरी समस्या यह है कि डेटाबेस में कोई लॉग स्टेटमेंट नहीं लिखा गया है। विचित्र रूप से, जब डीबगिंग करते हैं, तो FormatValue() विधि में एक ब्रेकपॉइंट केवल तब होता है जब मैं सेवा को रोकता हूं।
मैंने इससे संबंधित सामानों के भार से गुजर लिया है लेकिन अभी तक कोई जवाब नहीं मिला है। क्या कोई ऐसा करने में कामयाब रहा है, या मैं गलत निशान पर हूं। पीएस मैंने AdoNetAppender को विस्तारित करने का भी प्रयास किया है लेकिन यह आपको पैरामीटर मान सेट करने के लिए उपयोग नहीं करता है।
मैं लॉग 4नेट के साथ फंस गया हूं और मेरे पास विंडो है समाधान में सेवा घटक जो HttpContext तक पहुंच नहीं रखते हैं, हालांकि हम उपयोगकर्ता नाम को एक स्ट्रिंग के रूप में पास करते हैं। मैं वास्तव में ThreadContext प्रॉपर्टी सेट नहीं करना चाहता हूं, लॉग इन करें और फिर जब भी मुझे कुछ लॉग इन करने की आवश्यकता हो तो इसे अनसेट करें। मैं उम्मीद कर रहा था कि विस्तारित AdoNetAppenderParameter इसका ख्याल रखेगा। तुम्हारे सुझाव के लिए धन्यवाद। –