2009-04-03 11 views
48

यह 650694 जैसा है लेकिन कोई जवाब स्वीकार नहीं किया गया था, मुझे उन सुझावों में से कोई भी काम नहीं मिल सकता है, और मुझे संदेह है कि मैं थोड़ा अलग स्थिति में हो सकता हूं।log4net लॉगिंग स्तर को प्रोग्रामेटिक रूप से बदलें

मैं log4net.Config.XmlConfigurator.Configure() को कॉल कर रहा हूं। लेकिन कार्यक्रम में उस बिंदु के बाद, मैं लॉगिंग थ्रेसहोल्ड को केवल रनटाइम पर ज्ञात मान पर बदलना चाहता हूं।

अन्य प्रश्न से, मैं करने की कोशिश की:

((log4net.Repository.Hierarchy.Logger)mylogger.Logger).Level = log4net.Core.Level.Error; 

और:

var appender = new log4net.Appender.ColoredConsoleAppender(); 
appender.Layout = new log4net.Layout.PatternLayout(@"%date %-5level %message%newline"); 
appender.Threshold = log4net.Core.Level.Error; 
appender.ActivateOptions(); 
log4net.Config.BasicConfigurator.Configure(appender); 

लेकिन न तो एक कोई असर लगता है: मैं अभी भी डीबग दिखाई दे रही है और जानकारी कंसोल पर बयान प्रवेश करने ।

मेरे कूबड़ कि मैं एक नया appender, जो appender एक्सएमएल config (जो बताता है यह डीबग स्तर संदेशों मुद्रित करने के लिए) में घोषित पर कोई प्रभाव नहीं जोड़ रहा है, लेकिन मैं इस बात के लिए कोई सबूत अभी तक नहीं है ।

मैं थोड़ी देर के लिए log4net एपीआई के माध्यम से खुदाई कर रहा हूं, और मैं इसे देख नहीं रहा हूं। क्या मुझे कुछ आसान याद आ रहा है?

+1

लॉगर के स्तर को "त्रुटि" में सेट करना उस लॉगजर से लॉग इन होने से किसी भी डीबग या जानकारी आउटपुट को रोकना चाहिए। आप लॉगर के लिए DEBUG और INFO देख रहे हैं जिसका लॉगिंग स्तर आप बदल रहे हैं? – Eddie

+0

यह एक अच्छा मुद्दा है: # 1 शायद केवल एक लॉगर के लिए थ्रेसहोल्ड सेट करता है। लेकिन # 2 ऐसा लगता है कि यह वैश्विक होना चाहिए। – Ken

+0

हां # 1 केवल एक ही लॉगर इंस्टेंस के लिए थ्रेसहोल्ड सेट करता है जिसे आप बदल रहे हैं, साथ ही पदानुक्रम में इसके नीचे कोई भी लॉगर जो स्पष्ट रूप से सेट स्तर नहीं है। – Eddie

उत्तर

22

अंत में एक कामकाजी समाधान, here मिला।

बड़ा टुकड़े थे:, सभी वालों पर सीमा निर्धारित करने के लिए

  • जरूरत सहित जड़ लकड़हारा "नाम से प्राप्त नहीं किया जा सकता है"
  • पदानुक्रम के LevelMap से स्तर प्राप्त करने की आवश्यकता

अच्छे संकेत वाले प्रश्न पूछने के लिए एडी के लिए बड़ा धन्यवाद, जिसने मुझे सही शब्दों को Google पर ले जाने का नेतृत्व किया। मैंने कभी अकेले यह नहीं सोचा होगा।

(इसके अलावा: रिपोजिटरी, पदानुक्रम, लॉगर, रूट लॉगर, लेवलमैप - मुझे नहीं पता था कि लॉगिंग लाइब्रेरी को इस जटिल बनाने के लिए भी संभव था। इसमें लगभग 20 परतें हैं, जो मुझे यकीन है कि यह लचीला बनाता है कुछ भी के लिए पर्याप्त है, लेकिन यह लगभग असंभव सरल काम करने के लिए "सीमा एक्स ऊपर कोई संदेश लॉग इन नहीं करते" की तरह बना देता है गाह)

+0

हाँ, यह कल्पना की तुलना में यह अधिक जटिल है! अच्छा लिंक प्रश्न 650694 से मेरा जवाब कम से कम log4Net 1.2.10 के साथ कई अनुप्रयोगों में मेरे लिए काम किया है। मुझे नहीं पता कि यह आपके लिए क्यों काम नहीं करता है, लेकिन जो आपने पाया वह * पूरी तरह से * है! – Eddie

8

यह करने के लिए एक आसान तरीका है:।!

LogManager.GetRepository().Threshold = Level.Info; 

अधिक जानकारी here पाया जा सकता है।

+4

लॉगिंग पहले ही कॉन्फ़िगर किए जाने के बाद यह लॉगिंग स्तर नहीं बदला। –

+2

आपको यह भी कहना होगा कि कॉन्फ़िगरेशन RaiseConfigurationChanged के माध्यम से बदल गया है। –

62

यहां मौजूद कोई भी समाधान मेरे लिए काम नहीं करता है। यह कार्यावधि में नहीं बदल रहा था

यहाँ क्या मेरे लिए काम किया है:

((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root.Level = Level.Debug; 
((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).RaiseConfigurationChanged(EventArgs.Empty); 

आप अपने config में परिवर्तन करने के बाद RaiseConfigurationChanged कॉल करनी होगी।

+0

हाँ - यह पूरी तरह से काम करता है। धन्यवाद। –

0

मैं एक ही दृष्टिकोण की तलाश में था और पाया कि नवीनतम एनएलओजी संस्करण 3.2.0.0 रनटाइम पर लॉगिंग स्तर बदलने के विकल्प को नीचे देता है।

LogManager.GlobalThreshold = LogLevel.Debug; 

मुझे लगता है कि एक और दृष्टिकोण LogManager.Configuration उपयोग करने के लिए वैरिएबल का उपयोग config सेटिंग्स को अधिलेखित करने के लिए हो सकता है।

+0

LogManager के लिए डिफ़ॉल्ट है। ग्लोबल थ्रेसहोल्ड LogLevel.Trace है – seUser

1

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

तब मैंने पाया विन्यास फाइल में appender तत्व भी एक सीमा से मूल्य निर्दिष्ट किया है कि। इसलिए जब मैं डिबग को स्तर को बदलना चाहता था, जबकि एपेंडर को चेतावनी देने के लिए सेट किया गया था, उदाहरण के लिए, उस ऐपेंडर ने अतिरिक्त संदेश नहीं उठाए क्योंकि वे थ्रेसहोल्ड से नीचे थे। इसलिए मैंने एपेंडर कॉन्फ़िगरेशन से थ्रेसहोल्ड हटा दिया और केवल स्तर कॉन्फ़िगरेशन रखा।

<root> 
    <level value="Warn" /> 
    <appender-ref ref="RollingFile" /> 
    </root> 

फिर मैं रनटाइम पर स्तर को बदलने के लिए केन के समाधान का उपयोग कर समाप्त हुआ।

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