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