2012-11-29 19 views
40

लॉग 4j का उपयोग करके एकाधिक लॉग फ़ाइलों को लिखते समय मुझे डुप्लिकेट लॉग संदेशों में समस्या हो रही है।लॉग 4j: एकाधिक लॉगर्स, स्तर और परिशिष्ट

वर्तमान में मैं अपने foo.log फ़ाइल में foobar नामित विशिष्ट लकड़हारा के लिए INFO स्तर डेटा (और ऊपर की तरफ) लॉग इन करने की कोशिश कर रहा हूँ और फिर सभी WARN स्तर लॉग संदेश (और ऊपर की तरफ) bar.log फ़ाइल में सभी वालों के लिए ।

इसके परिणामस्वरूप, डुप्लिकेट लॉग संदेश foo.log फ़ाइल (प्रत्येक पंक्ति को दो बार लॉग किया गया था) पर लिखा गया था और कुछ त्वरित शोध के बाद मुझे पता चला कि इसे ठीक करने के सुझाव को मेरी गुण फ़ाइल में log4j.additivity.foobar=false जोड़ना था।

इस के साथ समस्या यह है कि हालांकि यह डुप्लिकेट लाइनों बंद हो जाता है, foobar लकड़हारा से WARN संदेश bar.log फाइल करने के लिए कभी नहीं लिखा जाता है।

मेरे log4j गुण फ़ाइल इस प्रकार है:

log4j.rootLogger = WARN, FOO, BAR 
log4j.logger.foobar = INFO, FOO 
log4j.additivity.foobar = false 

log4j.appender.FOO = org.apache.log4j.RollingFileAppender 
log4j.appender.FOO.layout = org.apache.log4j.PatternLayout 
log4j.appender.FOO.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n 
log4j.appender.FOO.File = foo.log 

log4j.appender.BAR = org.apache.log4j.RollingFileAppender 
log4j.appender.BAR.layout = org.apache.log4j.PatternLayout 
log4j.appender.BAR.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n 
log4j.appender.BAR.File = bar.log 

किसी को भी पता है कि कैसे मैं दोनों लॉग फाइल करने के लिए लॉग संदेश लिखने जा सकता है (इससे पहले कि मैं additivity संपत्ति की स्थापना शुरू कर दिया के रूप में यह कर रहा था) और अभी भी डुप्लिकेट लॉग संदेशों को रोकें?

कृपया ध्यान दें, यह समस्या का एक सरल सारांश है। असली दुनिया परिदृश्य में कई लॉगर्स हैं और दो से अधिक लॉग फाइलें हैं

उत्तर

54

यह समस्या दो भागों में हल की जा सकती है।

1. रोकें नकल संदेशों

लॉग संदेशों दो बार लिखा गया है क्योंकि हम दोनों rootLogger और log4j.logger.foobar श्रेणी में FOO appender सूचीबद्ध लॉग इन करें। इसलिए हम appender निकालना होगा और केवल श्रेणी में लॉगिंग स्तर को परिभाषित:

log4j.rootLogger = WARN, FOO, BAR 
log4j.logger.foobar = INFO 

इसका मतलब है कि log4j.logger.foobar से जानकारी स्तर संदेशों वालों appenders के सभी के लिए ऊपर की तरफ उगाया जाता हैरूट लॉगर, लेकिन केवल एक बार प्रत्येक लॉग फ़ाइल में लिखा जाएगा।

2. रोकें जानकारी स्तर संदेश bar.log को

log4j.logger.foobar श्रेणी के लिए जानकारी के स्तर का लॉग संदेशों के सभी के बाद से rootLogger में appenders द्वारा विरासत में मिला जा रहा है लिखा जा रहा , हमें INFO स्तर संदेशों को रिकॉर्ड करने के लिए BAR एपेंडर को रोकने की आवश्यकता है।

हम खुद appender बार पर थ्रेसहोल्ड संपत्ति की स्थापना द्वारा इस लक्ष्य को हासिल कर सकते हैं:

log4j.appender.BAR.Threshold = WARN 

यह जानकारी स्तर स्टेटमेंट bar.log फ़ाइल रूप में लॉग इन किया जा रहा नहीं कर पाएगा यह केवल WARN और ऊपर के स्तर स्वीकार करेगा।

तो पूरा log4j गुण फ़ाइल के रूप में निम्नानुसार होगा:

log4j.rootLogger = WARN, FOO, BAR 
log4j.logger.foobar = INFO 

log4j.appender.FOO = org.apache.log4j.RollingFileAppender 
log4j.appender.FOO.layout = org.apache.log4j.PatternLayout 
log4j.appender.FOO.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n 
log4j.appender.FOO.File = foo.log 
log4j.appender.FOO.Threshold = INFO 

log4j.appender.BAR = org.apache.log4j.RollingFileAppender 
log4j.appender.BAR.layout = org.apache.log4j.PatternLayout 
log4j.appender.BAR.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n 
log4j.appender.BAR.File = bar.log 
log4j.appender.BAR.Threshold = WARN 
+0

यह सब अच्छा है और अच्छी तरह है, लेकिन यह क्या नहीं कहा गया था है। यह लॉगर्स द्वारा अंतर कैसे करता है? मूल प्रश्न में कहा गया है कि केवल 'foobar' foo पर जाता है, और foobar समेत सभी लॉगर्स –

+0

पर जाते हैं प्रश्न एक समाधान के लिए पूछता है जहां' foobar' logger के लिए सभी 'INFO' संदेश' foo.log' फ़ाइल 'पर जाते हैं और सभी ' सभी लॉगर्स के लिए WARN' संदेश 'bar.log' फ़ाइल पर जाते हैं (और यह भी कि प्रत्येक लॉग संदेश केवल उचित फ़ाइल में लिखा जाता है)। –

+0

नहीं, __all loggers__, न केवल 'foobar' 'bar.log' पर भेजा जाता है। प्रश्न के अनुसार: "वर्तमान में मैं अपने foo.log फ़ाइल में 'foobar' नामक विशिष्ट लॉगर के लिए' INFO' स्तर डेटा और बार में __all loggers__ के लिए सभी 'WARN' स्तर लॉग संदेश लॉग इन करने का प्रयास कर रहा हूं। लॉग फ़ाइल।" –

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