2009-02-23 20 views
67

this thread में कई लोगों ने संकेत दिया है कि वे log4net का उपयोग करते हैं। मैं TraceSources का प्रशंसक हूं और जानना चाहता हूं कि log4net का उपयोग क्यों किया जाता है।ट्रैससोर्स बनाम लॉग 4नेट

यहाँ कारण है कि मैं पता लगाने के सूत्रों की तरह:

  • प्लगेबल श्रोताओं - एक्सएमएल, textfile, कंसोल, इवेंटलॉग, अपने खुद के
  • अनुकूलन का पता लगाने स्विच (त्रुटि, चेतावनी, जानकारी, वर्बोज़, प्रारंभ, समाप्ति रोल , कस्टम)
  • अनुकूलन विन्यास
  • लॉगिंग आवेदन ब्लॉक सिर्फ TraceListeners का एक बड़ा सेट एक ASP.NET आर के भीतर की गतिविधियों/स्कोप (जैसे, सहयोगी सभी लॉग के
  • सहसंबंध है किसी दिए गए ग्राहक के साथ समतुल्य
  • सेवा ट्रेस व्यूअर आपको व्यक्तिगत रूप से इन गतिविधियों के खिलाफ घटनाओं को देखने की अनुमति देता है
  • यह सब app.config/web.config में कॉन्फ़िगर करने योग्य है।

चूंकि .NET फ्रेमवर्क आंतरिक रूप से TraceSources का उपयोग करता है, यह मुझे ट्रेसिंग कॉन्फ़िगर करने का एक सतत तरीका भी देता है - log4net के साथ, मुझे log4net के साथ-साथ TraceSources को कॉन्फ़िगर करना होगा।

लॉग 4नेट मुझे क्या देता है कि TraceSources नहीं (या यह कुछ कस्टम ट्रेस लिस्टेनर्स लिखकर नहीं किया जा सका)?

+22

मुझे यह सवाल एसओ के योग्य पाया गया, और यह भी कई जानकारी प्राप्त करने के लिए पर्याप्त उत्तर मिला कि मुझे अब और जानकारी की तलाश नहीं करनी है। जो भी इस सवाल को 'रचनात्मक नहीं' के रूप में बंद करता है, मैं सवाल करता हूं कि यह लॉग 4नेट की ओर पूर्वाग्रह और प्राप्त उत्तरों की रेखा के साथ सामान्य असंतोष के कारण किया गया था या नहीं। यह प्रश्न और कई उत्तर लॉग 4नेट और .NET ट्रेसिंग दोनों के आस-पास डर, अनिश्चितता, संदेह और सादा गलत जानकारी को स्पष्ट करने में मदद करते हैं। –

+3

मुझे यह प्रश्न भी उपयोगी पाया है। और वास्तव में वास्तव में मिलान किया जो मैं खोज रहा था। – Darkonekt

उत्तर

9

मुझे लगता है कि लॉग 4नेट आपके लिए सूचीबद्ध हर कुछ कर रहा है।

प्लग करने योग्य श्रोताओं को परिशिष्ट की तरह लगता है - उनमें से बहुत सारे हैं और वास्तव में मैंने रोलिंग लॉग फ़ाइल को भी हमेशा लॉग इन करने के लिए है। लॉग (फ़ाइल एसोसिएशन के लिए), ईमेल एपेंडर को एक सीसी फ़ील्ड जोड़ा, और आखिरकार ट्यून किया रंगीन कंसोल एपेंडर के लिए मेरे पसंदीदा मूल्य। अगर मैं ऐसा बोल्ड हो सकता है - मेरी रंगीन सांत्वना खुशी:

<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> 
<!-- Can Use: 
     Blue 
     Green 
     Red 
     White 
     Yellow 
     Purple 
     Cyan 
     HighIntensity 
     --> 
<mapping> 
    <level value="FATAL" /> 
    <foreColor value="Yellow, HighIntensity" /> 
    <backColor value="Red" /> 
</mapping> 
<mapping> 
    <level value="ERROR" /> 
    <foreColor value="White" /> 
    <backColor value="Purple, HighIntensity" /> 
</mapping> 
<mapping> 
    <level value="WARN" /> 
    <backColor value="Blue" /> 
    <foreColor value="White" /> 
</mapping> 
<mapping> 
    <level value="INFO" /> 
    <backColor value="Green" /> 
    <foreColor value="White" /> 
</mapping> 
<mapping> 
    <level value="DEBUG" /> 
    <foreColor value="White" /> 
</mapping> 
<layout type="log4net.Layout.PatternLayout"> 
    <!--<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />--> 
    <!--<conversionPattern value="%-5level %file:%line - %message%newline" />--> 
    <conversionPattern value="%level %logger:%line %newline  %message%newline" /> 
</layout> 

अनुकूलन का पता लगाने स्विच: log4net केवल गंभीर त्रुटि के साथ आता है शब्दाडंबर बढ़ाने के क्रम में जानकारी डीबग चेतावनी दी है। एकमात्र जिसे मैं वास्तव में याद करता हूं वह है कि किसने लॉग-इन किया है।

अनुकूलन विन्यास: मैं एक log4net.config फ़ाइल जो मैं रनटाइम पर लोड का उपयोग (या ग एक लॉग लिखें:। \ शिकायत है कि मैं config नहीं मिल सकता है)

Try 
     ' Get log4net configuration from file 
     Dim logConfigFile As FileInfo 
     logConfigFile = New FileInfo(".\log4net.config") 

     If logConfigFile.Exists Then 
      XmlConfigurator.Configure(logConfigFile) 
     Else 
      CreateEmergenceLogFile(logConfigFile.FullName) 
     End If 

    Catch ex As Exception 
     Console.Out.WriteLine("Could not load the log4net config file") 
    End Try 

सिर्फ एक बड़ा TraceListeners का सेट: क्षमा करें कि एक - मैं इसके लिए अपना शब्द ले जाऊंगा।

गतिविधियों/क्षेत्रों का सहसंबंध: क्या आपका मतलब है कि प्रत्येक फ़ाइल (कक्षा पढ़ें) को अपना नामित लॉग मिलता है जिसमें अलग-अलग लॉग स्तर सीमाएं हो सकती हैं।

Private Shared _logger As log4net.ILog = _ 
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType) 

Private Shared _loggerAttribute As log4net.ILog = _ 
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName & ".Attribute") 

Private Shared _loggerCache As log4net.ILog = _ 
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName & ".Cache") 

सेवा ट्रेस दर्शक: वास्तव में आप एक भी कक्षा में खंड प्रवेश

एक वर्ग फ़ाइल में (जो सच में बहुत ज्यादा ... ऐसा करने के लिए बड़े हो गए हो सकता है) कर सकते हैं log4net में .config:

<logger name="NipissingU.ADWrapper.EntryTools.Attribute"> 
    <level value="INFO" /> 
    </logger> 
    <logger name="NipissingU.ADWrapper.EntryTools.Cache"> 
    <level value="WARN" /> 
    </logger> 

यह सब app.config/web.config में विन्यास योग्य है: अच्छी तरह से हो सकता है कि ASP.NET में एक अच्छी बात है, मैं नहीं जानता कि, लेकिन जब अमीर ग्राहक सेम गिनती क्षुधा बनाने मुझे एक अलग विन्यास फाइल पसंद है।

यहां सब कुछ सिर्फ मेरी छोटी उपयोग चाल है।

hth, -माइक

+0

धन्यवाद माइक। सहसंबंध थोड़ा अलग है - आप एक लॉग "संदर्भ" के बारे में एक ग्रिड और मेटाडेटा को जोड़ सकते हैं - जब तक संदर्भ "बंद" होता है तब तक सभी निशान उस संदर्भ से संबंधित होते हैं। किसी विशेष आदेश या ग्राहक से संबंधित सभी लॉग देखना आसान बनाता है उदाहरण के लिए –

+0

इसके विपरीत, प्रति ग्राहक/ऑर्डर के लिए अलग-अलग लॉग फाइलें बहुत परेशान हो सकती हैं –

+0

संदर्भ भी मैं जो कह सकता हूं उससे घोंसले का समर्थन करता हूं, हालांकि मैंने कोशिश नहीं की है यह –

3

लॉग 4नेट के लक्ष्यीकरण का उपयोग करने के लिए लॉग 4नेट को पसंद करने का कारण - लॉग 4नेट के साथ, मैं स्वतंत्र रूप से अपने आवेदन (डेटा एक्सेस, सेवाएं, व्यवसाय तर्क, आदि) और विभिन्न उपप्रणाली (प्रमाणीकरण, प्रसंस्करण, आदि) की विभिन्न परतों का स्वतंत्र रूप से साधन कर सकता हूं। और स्वतंत्र रूप से प्रत्येक उपप्रणाली के लॉगिंग को चालू/बंद करें।

यह flexibilty मुझे पूरे सिस्टम के लिए फायरहोज चालू किए बिना एक सबसिस्टम के लिए विस्तृत लॉगिंग कॉन्फ़िगर करने की अनुमति देता है।

ट्रेस क्लास [जैसे ट्रेस इनफॉर्मेशन)) पर प्रदान की गई स्थिर विधियां यह निर्दिष्ट करने का कोई तरीका नहीं देती हैं कि लॉगिंग किस उपप्रणाली से है, इसलिए यह मेरे स्वयं के ट्रेस लिस्टनर को लिखकर आसानी से प्रदान नहीं किया जाता है।

एक अन्य कारण प्रदर्शन है - मेरे आवेदन का एक टुकड़ा है जो संभावित रूप से प्रति सेकंड कई हजार संदेश लॉग करता है। Log4Net एक कम ओवरहेड लगाता है। इसके विपरीत, पिछली बार मैंने इसे देखा, लॉगिंग एप्लिकेशन ब्लॉक ने लॉग इन किए गए प्रत्येक संदेश के लिए अपने एक्सएमएल कॉन्फ़िगरेशन को दोहराया, जिससे ब्लॉक बहुत भारी और धीमा हो गया।

+12

पुन: लक्ष्यीकरण - TraceSource यह प्रदान करता है।आप एकाधिक TraceSources कॉन्फ़िगर कर सकते हैं और प्रत्येक को व्यक्तिगत रूप से ट्यून कर सकते हैं। –

+1

पुन: प्रदर्शन। मुझे आश्चर्य होगा अगर यह अभी भी मामला है, लेकिन यह निश्चित रूप से कुछ है जो मैं जांच करूंगा। लोग प्रति सेकंड एक हजार लॉग संदेश पढ़ने के साथ कैसे सामना करते हैं? :) –

+1

मुझे पता था कि स्पीड रीडिंग कोर्स आसान होगा – stimms

0

इम एक ही रास्ता log4net काम करता है पता चल सकीं, उस ढांचे का उपयोग कर एक स्पष्ट बोनस log4j का उपयोग कर के लिए इस्तेमाल किया उन लोगों के लिए तत्काल परिचित है है।

एक और छोटा लाभ यह है कि log4net का उपयोग कर परीक्षण ड्राइविंग लॉगिंग बेहद सरल है; लॉगर्स log4net.ILog लागू करें। फिर मैं माइक्रोसॉफ्ट समाधान से परिचित नहीं हूं, लेकिन मैं सोच रहा हूं कि बिना किसी सिस्टम को एक मुखौटा लिखने के बिना यह कैसे करेगा। डायग्नोस्टिक्स। स्क्रिप्ट क्लास।

ट्रेस स्रोत प्रलेखन पर एक सरसरी रूप से देखने के साथ, मुझे लेआउट के बराबर नहीं मिल सका, और यह जानने में रुचि होगी कि क्या यह समकक्ष मौजूद है या नहीं। PatternLayout datestamps, धागा जानकारी की तरह आम डेटा के साथ लॉग प्रविष्टियों फ़ॉर्मेट करने के लिए काफी उपयोगी है, लॉग संदर्भ आदि log4net PatternLayout डॉक्स: http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html

साथ ही, यह देखते हुए कि एक प्रवेश ढांचे के लिए एक्सटेंशन लिखने शायद एक क्लासिक 'मेटा-समस्या' है , log4net तालिका में प्लग करने योग्य श्रोता समकक्षों की एक भव्य सूची लाता है।

appenders की सूची: http://logging.apache.org/log4net/release/config-examples.html

+0

एक सिस्टम के लिए कोडप्लेक्स (http://essentialdiagnostics.codeplex.com/) पर आवश्यक डायग्नोस्टिक्स प्रोजेक्ट देखें। पैटर्न/प्रारूप समर्थन के साथ डायग्नोस्टिक्स ट्रेस लिस्टनर, साथ ही ट्रैससोर्स के लिए एक इंटरफ़ेस और मुखौटा (हालांकि आप बस एक अटैचमेंट करके परीक्षण कर सकते हैं परीक्षण ट्रेस श्रोता)। –

54

बहुत शुरुआती दिनों (.NET 1.0) .NET फ्रेमवर्क में पता लगाने में बहुत सीमित था।

उदाहरण के लिए TraceSource विभाजन .NET 2.0 तक नहीं आया था और आपके पास केवल चार स्तर थे (त्रुटि, चेतावनी, सूचना, Verbose), हालांकि आप चाहें तो विभाजन के लिए आधा दर्जन बूलियन स्विच का उपयोग कर सकते हैं।

log4j जावा में लोकप्रिय है और इसलिए .NET पोर्ट के लिए बहुत अधिक समर्थन मिला है, और एक बार यह लोकप्रिय हो जाने के बाद, इस तरह से इस तरह से रुक गया, भले ही लोग इसे सही तरीके से उपयोग न करें (उदाहरण के लिए इसे एक में लपेटना सिंगलटन लॉगर और इसकी मुख्य विशेषता खोना)।

फिर भी, मुझे लगता है कि लॉग 4नेट और अन्य ढांचे (जैसे एनएलओजी, कॉमन। लॉजिंग, और यहां तक ​​कि एंटीलिब) जमीन से अपने स्वयं के लॉगिंग सिस्टम को लागू करके गलत तरीके से चला गया है, यानी आप जिस तरह से लॉग स्टेटमेंट लिखते हैं प्रथम स्थान।

मैं प्रयास देखने के लिए बहुत पसंद करता हूं, खासकर .NET 2.0 के बाद से, .NET में पहले से मौजूद ठोस आधार को विस्तारित करने के लिए रखा जाता है। एक परियोजना के लिए जो पहले से मौजूद है, विस्तारित करता है, कोडप्लेक्स (http://essentialdiagnostics.codeplex.com/) पर आवश्यक डायग्नोस्टिक प्रोजेक्ट पर नज़र डालें।

log4net में से कुछ ताकत:

  • यह log4j के समान है यदि आप एक मिश्रित वातावरण चलाने के लिए और लगातार प्रवेश करना चाहते हैं।

  • स्वत: लॉगर पदानुक्रम जो विरासत सेटिंग्स को विरासत में डालता है, इसकी तुलना में आप कितने ट्रेस स्रोतों को लागू करते हैं और प्रत्येक को कॉन्फ़िगर करना चाहते हैं। (हालांकि शायद कुछ मामलों में overkill)।

  • log4net पहले से ही चारों ओर 28 appenders (श्रोताओं का पता लगाने के बराबर) है System.Diagnostics जबकि केवल 10 (लेकिन अधिक के लिए Essential.Diagnostics परियोजना देखें), इसलिए यदि आप वास्तव में लगता है कि आप RemoteSyslogAppender, NetSendAppender आवश्यकता हो सकती है, AnsiColorTerminalAppender या TelnetAppender, तो आप भाग्य में हैं।

कमियां (System.Diagnostics की तुलना में):

  • आप इसलिए यदि आप पहले से ही source.TraceEvent() का उपयोग कर रहे हैं, विभिन्न प्रवेश सिंटैक्स का उपयोग करने की जरूरत है, आप के माध्यम से जाने के लिए और प्रतिस्थापित करने की आवश्यकता सब कुछ।

  • यह सहसंबंध के लिए अलग वाक्यविन्यास तक भी विस्तारित है, इसलिए आपको CorrelationManager से log4net संदर्भों में बदलने की आवश्यकता है।

  • फ्रेमवर्क ट्रेसिंग (उदा। डब्ल्यूसीएफ) के साथ आसानी से एकीकृत नहीं करता है।

  • इवेंट आईडी के लिए खराब समर्थन (एक अलग एक्सटेंशन प्रोजेक्ट आईवेन्टलॉग का उपयोग करने की आवश्यकता है)।

  • अभी तक विंडोज (Vista), या सेवा ट्रेस व्यूअर XML प्रारूप के लिए इवेंट ट्रेसिंग का समर्थन नहीं करता है।

4

log4net के बजाय TraceSources प्रयोग करने के लिए एक अन्य कारण ही ट्रेसिंग है: log4net केवल (संदेश) लॉगिंग लेकिन कैसे एक वस्तु (एक साथ कई जानकारियां) का पता लगाने के लिए इस्तेमाल किया जा सकता है? बेशक Log4Net में बहुत सारे श्रोताओं को लागू किया गया है, लेकिन क्या मुझे इन सभी की आवश्यकता है? ज्यादातर मामलों में नहीं। और यदि मुझे एक विशेष श्रोता की ज़रूरत है, तो यह मेरे लिए लागू नहीं करना मुश्किल है, है ना? उदाहरण के लिए मुझे एक डेटाबेस में ट्रेस करने के लिए श्रोता की आवश्यकता होती है (न केवल संदेश बल्कि अलग-अलग सूचनाएं {स्ट्रिंग, int's, आदि} एक ही समय में)।

क्या मैं सही हूँ?

+0

दरअसल मुझे विश्वास है कि आप हैं (कम से कम ट्रेससोर्स पक्ष पर) – Mark

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