2012-08-23 16 views
5

मेरी log4j.properties यदि यहlog4j में अलग लॉगर्स कैसे प्राप्त करें?

# General configuration 
log4j.rootLogger = ERROR, ConsoleAppender 

# Appender configuration 
log4j.appender.ConsoleAppender = org.apache.log4j.ConsoleAppender 
log4j.appender.ConsoleAppender.layout = org.apache.log4j.PatternLayout 
log4j.appender.ConsoleAppender.layout.ConversionPattern = %5p (%c) %m%n 
#Other Loggers 
log4j.logger.com.foo=INFO 
log4j.logger.com.foo.Bar=DEBUG 
log4j.logger.org.springframework=INFO 

लग रहा है वहाँ एक आसान तरीका सिर्फ वालों com.foo, com.foo.Bar, root, और org.springframework प्राप्त करने के लिए है। और विशिष्ट वर्ग जो बनाए गए हैं और स्तरों का उत्तराधिकारी नहीं हैं (आईई com.foo.bar.Baz?
मेरे उद्देश्यों के लिए मैं एक व्यवस्थापक पृष्ठ बनाना चाहता हूं जो इन लॉगर्स और उनके स्तर को प्रदर्शित करता है, लेकिन सभी लॉगर्स नहीं, केवल उन लोगों को जो सीधे कॉन्फ़िगर किया गया है गुणों के माध्यम से। वर्तमान में, मैं अभिभावक पदानुक्रम को पार कर रहा हूं जब तक कि मैं एक लॉगर में नहीं आ जाता जिसके पास उसके माता-पिता का एक अलग स्तर होता है, लेकिन यदि वे पदानुक्रम में हैं और कुछ उच्च स्तर के समान स्तर निर्धारित करते हैं तो कुछ कॉन्फ़िगर किए गए लॉगर्स छुपा सकते हैं।

+1

प्रश्न से बाहर संपत्तियों को पार्स कर रहा है? –

+0

नहीं, log4j प्रोग्रामेटिक रूप से यह पता लगाने के लिए कि कौन से लॉगर्स कॉन्फ़िगर किए गए हैं, और अन्य लॉगर्स से विरासत में नहीं हैं। – Kodi

उत्तर

4

आप कुछ इस तरह कर सकता है सबसे पहले लॉग प्रबंधक से सभी वालों मिलती है:।

Enumeration<Category> loggers = LogManager.getCurrentLoggers(); 

तो फिर तुम अपने स्तर के लिए प्रत्येक लकड़हारा पूछ सकते हैं:

Level currentLevel = logger.getLevel(); 

currentLevelnull हो सकता है अगर यह स्पष्ट रूप से सेट नहीं किया गया है। इसलिए, अगर लॉगर log4j.properties में किसी विशिष्ट स्तर पर सेट किया गया था, तो आपको एक गैर-शून्य मान मिलेगा। अन्यथा आपको null मान मिलेगा। रूट लॉगर हमेशा एक स्तर की रिपोर्ट करता है, ताकि यह एक विशेष मामला होगा। इस तरह, आपको log4j.properties फ़ाइल को पार्स करने की आवश्यकता नहीं होगी।

एकमात्र समस्या यह है कि अगर आपके कोड में कहीं भी आप setLevel() लॉगर पर आते हैं, तो यह गैर-शून्य की रिपोर्ट भी करेगा और आपकी सूची में दिखाई देगा। ऐसा इसलिए है क्योंकि log4j नहीं जानता है कि एक स्तर सेट किया गया था, केवल तभी सेट किया गया था। इन दो मामलों को अलग करने के लिए, आपको अभी भी log4j.properties पार्स करने की आवश्यकता होगी।

इसके अलावा, ध्यान रखें कि यह केवल लॉगर्स पर काम करता है जो वर्तमान में लोड हो चुके हैं। इसलिए यदि com.foo.Bar कभी लोड नहीं हुआ था, तो आप इसे अपनी सूची में नहीं देख पाएंगे, भले ही इसका स्पष्ट रूप से log4j.properties में उल्लेख किया गया हो। Log4J को गैर-मौजूदा लॉगर्स के बारे में पता नहीं है जो भविष्य में बनाई जा सकती हैं। फिर, इसके लिए आपको log4j.properties का विश्लेषण करना होगा।

+4

LogManager में कोई getCurrentLoggers() नहीं है। Log4j 2.2। –

+1

@MagnoC राइट, मेरा जवाब [Log4J v1] (https://logging.apache.org/log4j/1.2/apidocs/index.html?org/apache/log4j/LogManager.html) को संदर्भित करता है। लॉग 4 जे v2 अभी भी उत्तर के समय दो साल दूर था (जारी 2014)। –

+0

ठीक है। मैं बस शिकायत कर रहा हूं ... मुझे Log4J को अपने स्वयं के लॉगर क्लास में लपेटने की आवश्यकता है (नामों को संरक्षित करने के लिए मुझे लॉग 4 जे जेएआर को हटाने और समान वर्गों के साथ अपनी कक्षाएं बनाने की आवश्यकता है) और लॉग 4 जे जेएआरएस दोबारा जोड़ें। इसलिए मैं अपने लॉगर क्लास (पूर्ण वर्ग नाम का उपयोग करके) से वास्तविक लॉगर कहता हूं। अब मैं अपने लॉगर को सक्षम और अक्षम कर सकता हूं। अक्षम होने पर, मैं वास्तविक लॉग के माध्यम से लॉग स्ट्रिंग पास नहीं करता हूं। –

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