2015-05-29 4 views
6

जब मैं अलग प्रवेश स्तरों log4net के साथ उपलब्ध उपयोग करना चाहता था, मुझे पता चला कि मैं विधि ILogger.Log है, जो इस तरह दिखता है उपयोग करने के लिए की जरूरत:ILogger.Log विधि declaringType पैरामीटर

void Log(Type callerStackBoundaryDeclaringType, Level level, object message, Exception exception); 

हम कर सकते हैं इस विधि को कॉल करने के लिए हमारे सामान्य आईएलओजी संदर्भ से एक आईएलओगर संदर्भ प्राप्त करें और आमतौर पर इस कॉल को एक विस्तार विधि में लपेटने का सुझाव दिया जाता है।

//typical log4net ILog reference 
private static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

//suggested extension method 
public static void Trace(this ILog logger, object message, Exception e) 
{ 
    logger.Logger.Log(MethodBase.GetCurrentMethod().DeclaringType, log4net.Core.Level.Trace, message, e); 
} 

मैंने देखा है कि कैसे प्रतिबिंब कॉल की घोषणा प्रकार निरर्थक लग रहा है पाने के लिए: क्या हम मिल निम्नलिखित है। जब हमने अपना आईएलओजी संदर्भ पुनर्प्राप्त किया है तो हमने पहले से ही घोषणा प्रकार को गेटलॉगर पास कर दिया है। क्यों हम विधि प्रवेश करें, जो हम एक ILogger संदर्भ जो हम अपने Ilog संदर्भ से लिया गया है पर लागू कर रहे हैं के लिए एक और प्रकार संदर्भ में उत्तीर्ण होना था। सबसे महत्वपूर्ण बात यह है कि विस्तार विधि में घोषित प्रकार वह वर्ग होगा जिसमें एक्सटेंशन विधि शामिल है। Log4NetExtensions जैसे क्लास नाम के साथ अपने सभी ट्रेस लॉग को लॉग इन करना कोई समझ नहीं लेगा। अंत में, प्रतिबिंब महंगा माना जाता है, भले ही वर्तमान पद्धति को दर्शाती सस्ता हो सकता है, प्रतिबिंब कोड हर बार जब हम लोग इन सही नहीं लग रहा बुला। तो मैं एक परीक्षण करने का फैसला किया:

//I just created a logger 
var logger = logManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

//and then I called Log with different type parameters 
logger.Logger.Log(MethodBase.GetCurrentMethod().DeclaringType, log4net.Core.Level.Info, "hello!", null); 
logger.Logger.Log(logger.GetType(), log4net.Core.Level.Info, "hello!", null); 
logger.Logger.Log(null, log4net.Core.Level.Info, "hello!", null); 
logger.Logger.Log(typeof(System.Console), log4net.Core.Level.Info, "hello!", null); 

और जिसके परिणामस्वरूप लॉग निम्न की तरह देखा:

INFO 2015-05-29 11:06:57,200 [9] Foo.Program - hello! 
INFO 2015-05-29 11:06:57,207 [9] Foo.Program - hello! 
INFO 2015-05-29 11:06:57,207 [9] Foo.Program - hello! 
INFO 2015-05-29 11:06:57,207 [9] Foo.Program - hello! 

तो, ऐसा लगता है कि इस विधि के लिए प्रकार पैरामीटर नजरअंदाज कर दिया है। यह बहुत परेशान है। क्या कोई इन परिणामों की पुष्टि या इनकार कर सकता है? क्या किसी को पता है कि यह इस तरह से क्यों काम करता है? मैं इस पैरामीटर के लिए अपनी विस्तार विधि को शून्य के साथ बनाना चाहता हूं। क्या आप वही सुझाव देंगे? क्या मैं कुछ भूल रहा हूँ?

Log4net creating custom levels

Why isn't there a trace level in log4Net?

Log4net, how to log a verbose message?

उत्तर

4

प्रकार आप LogManager.GetLogger को पारित initializig ही वर्ग के शीर्ष पर लौटे लकड़हारा नाम के लिए प्रयोग किया जाता है , यही कारण है कि आपके सभी लॉगिंग कॉल 'Foo.Program' लेबल किए गए हैं।

प्रकार हालांकि Logger.Log के लिए पारित किया है "विधि की घोषणा के प्रकार इस कॉल के लिए लॉगिंग सिस्टम में ढेर सीमा है कि" और जहां स्टैक ट्रेस रिकॉर्ड करना बंद निर्धारित करने के लिए प्रयोग किया जाता है - जो आंतरिक रूप से आवश्यक है , या फिर स्टैक ट्रेस में लॉग 4नेट आंतरिक विधियां शामिल होंगी।

आप निश्चित रूप से एक एक्सटेंशन विधि बना सकते हैं जो callerStackBoundaryDeclaringType के रूप में शून्य हो जाती है, क्योंकि यह आंतरिक रूप से typeof(Logger) पर डिफ़ॉल्ट हो जाएगी।

+0

यह: "क्योंकि यह आंतरिक रूप से लॉगर के प्रकार के लिए डिफ़ॉल्ट होगा।" यही वह है जिसे मैं ढूंढ रहा था। कोई संदर्भ? या परीक्षण करने के तरीके पर कोई सुझाव? Log4net एक स्टैक ट्रेस कब उत्पन्न करता है? जब मैं अपवाद में जाता हूं? लेकिन अपवादों के अपने स्वयं के ढेर निशान नहीं है? –

+0

आप अपने स्वयं के स्टैक ट्रेस वाले अपवादों के बारे में सही हैं: log4net भी [पैटर्न में स्टैक ट्रेस को शामिल करने की अनुमति देता है] (http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout। एचटीएमएल) लेकिन पूर्व-निरीक्षण में यह एक सामान्य उपयोग केस नहीं है - संदर्भ के संबंध में, मैंने स्रोत में देखा, [लाइन 428 और 725] (https://apache.googlesource.com/log4net/+/refs/heads/1.2.12 /src/Repository/Hierarchy/Logger.cs) – stuartd

0

आप एक विस्तार विधि नहीं बनाना चाहिए जैसे आप का सुझाव दिया:

निम्न सवालों जिसका जवाब विस्तार विधि में घोषित प्रकार उपयोग करने का सुझाव है।

क्योंकि Ilog लॉगर स्थिर है यह बहुत भावना एक पैरामीटर मूल्य के रूप में उपयोग करने के लिए नहीं है।

private static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); // that part was ok 

public static void Trace(object message, Exception e) 
{ 
    Logger.DebugFormat(message, e); // Use InfoFormat or something else if needed 
} 

अगर आप सिर्फ मानक कार्यक्षमता का उपयोग, बस DebugFormat() (या कुछ और) कहते हैं सीधे:

try { 
    int i=7/0; 
} catch (Exception e){ 
    Logger.ErrorFormat("Looks like you are not Jon Skeet",e); 
} 

यह अपनी खुद की "बनाने के लिए मतलब नहीं है बस log4net निम्नलिखित तरीके से उपयोग ट्रेस "-माथ अगर आप इसमें कुछ भी नहीं जोड़ते हैं।

इसके अलावा यह (आमतौर पर) मतलब नहीं है प्रकार सेट करने के लिए जब तुम कुछ प्रवेश करते है, लेकिन जब लॉगर

+0

विस्तार विधि कई वर्गों, जिनमें से प्रत्येक अपने स्वयं के Ilog संदर्भ हमेशा की तरह है कि आप भी सुझाव दिया है में घोषित होगा द्वारा उपयोग किया जाएगा। इसके अलावा, मैं Level.Trace के साथ संदेश लॉग करना चाहता हूं, जिसमें ILog द्वारा प्रदान की गई मानक विधि नहीं है। –

संबंधित मुद्दे