2012-01-23 17 views
163

कॉन्फ़िगर करना मैं पहली बार SLF4J (log4j बाइंडिंग के साथ) का उपयोग करने की कोशिश कर रहा हूं।Log4j लॉगर्स को प्रोग्रामेटिक रूप से

  • लॉगर 1 "FileLogger" लॉग डीबग और DailyRollingFileAppender को संलग्न कर देता है:

    मैं 3 अलग नामित संग्रह करने वालों कि एक LoggerFactory जो विभिन्न स्तरों लॉग इन करें और विभिन्न appenders के लिए पुश संदेशों का होगा द्वारा दिया जा सकता है कॉन्फ़िगर करने के लिए चाहते हैं

  • लॉगर 2 "TracingLogger" लॉग ट्रेस + और एक JmsAppender
  • लॉगर को संलग्न कर देता है 3 "ErrorLogger" लॉग त्रुटि + और एक अलग JmsAppender
को संलग्न कर देता है

इसके अलावा मैं चाहता हूं कि वे प्रोग्रामेटिक रूप से कॉन्फ़िगर करें (जावा में, एक्सएमएल या log4j.properties फ़ाइल के विपरीत)।

मुझे लगता है कि, आमतौर पर, मैं init() विधि जैसे कुछ बूटस्ट्रैपिंग कोड में कहीं Logger एस को परिभाषित करता हूं। हालांकि, क्योंकि मैं slf4j-log4j का उपयोग करना चाहता हूं, मैं इस बारे में उलझन में हूं कि मैं लॉगर्स को परिभाषित कर सकता हूं और उन्हें कक्षा के लिए उपलब्ध करा सकता हूं।

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

लेकिन मैं क्लासपाथ पर उन log4j लॉगर्स को कैसे कॉन्फ़िगर कर सकता हूं ... जावा में ?!

+0

http://stackoverflow.com/questions/1666121/programmatically-creating-different -log-files-use-log4j – skaffman

+2

log4j 1.x के लिए 2.x के लिए नीचे दिए गए स्वीकृत उत्तर का उपयोग करें https://logging.apache.org/log4j/2.x/manual/customconfig.html – earcam

उत्तर

242

आप/जोड़ सकते हैं log4j करने के लिए प्रोग्राम के रूप में appender निकालें:

ConsoleAppender console = new ConsoleAppender(); //create appender 
    //configure the appender 
    String PATTERN = "%d [%p|%c|%C{1}] %m%n"; 
    console.setLayout(new PatternLayout(PATTERN)); 
    console.setThreshold(Level.FATAL); 
    console.activateOptions(); 
    //add appender to any Logger (here is root) 
    Logger.getRootLogger().addAppender(console); 

    FileAppender fa = new FileAppender(); 
    fa.setName("FileLogger"); 
    fa.setFile("mylog.log"); 
    fa.setLayout(new PatternLayout("%d %-5p [%c{1}] %m%n")); 
    fa.setThreshold(Level.DEBUG); 
    fa.setAppend(true); 
    fa.activateOptions(); 

    //add appender to any Logger (here is root) 
    Logger.getRootLogger().addAppender(fa); 
    //repeat with all other desired appenders 

मैं तुम्हें() कहीं है, जहां आप यकीन कर रहे हैं एक init में डाल दिया सुझाव देंगे, कि इस से पहले कुछ और निष्पादित किया जाएगा। फिर आप

Logger.getRootLogger().getLoggerRepository().resetConfiguration(); 

के साथ रूट लकड़हारा पर सभी मौजूदा appenders को हटा दें और अपने खुद के जोड़ने के साथ शुरू कर सकते हैं। इस काम के लिए आपको पाठ्यक्रम के कक्षा में log4j की आवश्यकता है।

टिप्पणी:
आप कोई भी Logger.getLogger(...) ले सकते हैं जो आप परिशिष्ट जोड़ना चाहते हैं। मैंने बस रूट लॉगर लिया क्योंकि यह सभी चीजों के नीचे है और अन्य श्रेणियों में अन्य परिशिष्टों के माध्यम से पारित की गई सभी चीज़ों को संभालेगा (जब तक अन्यथा additivity ध्वज सेट करके कॉन्फ़िगर नहीं किया जाता है)।

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

Logger fizz = LoggerFactory.getLogger("com.fizz") 

आप श्रेणी "com.fizz" के लिए एक लकड़हारा दे देंगे।
उपर्युक्त उदाहरण के लिए इसका मतलब है कि इसके साथ लॉग इन की गई सब कुछ को रूट लॉगर पर कंसोल और फ़ाइल एपेंडर को संदर्भित किया जाएगा।
यदि आप लॉगर.getLogger ("com.fizz") में एक एपेंडर जोड़ते हैं।addAppender (newAppender) फिर fizz से लॉगिंग को रूट लॉगर और newAppender से एपेंडर्स द्वारा प्रबंधित किया जाएगा।
आप कॉन्फ़िगरेशन के साथ लॉगर्स नहीं बनाते हैं, तो आप बस अपने सिस्टम में सभी संभावित श्रेणियों के लिए हैंडलर प्रदान करते हैं।

+2

धन्यवाद ओर्स! त्वरित प्रश्न - मैंने देखा है कि आप रूट लॉगर में परिशिष्ट जोड़ रहे हैं। क्या इसका कोई कारण है? – IAmYourFaja

+0

और, सबसे महत्वपूर्ण बात यह है कि मुझे यह निर्दिष्ट करना होगा कि कौन सी लॉगर SLF4J के लॉगरफ़ैक्टरी से पुनर्प्राप्त करने के लिए है। क्या log4j के रूट लॉगर के लिए SLF4J से पूछना संभव है? – IAmYourFaja

+3

@AdamTannon आप किसी भी Logger.getLogger (...) को ले सकते हैं। मैंने बस रूट लॉगर लिया क्योंकि यह सभी चीजों के नीचे है और अन्य श्रेणियों में अन्य परिशिष्टों के माध्यम से पारित की गई सभी चीज़ों को संभालेगा (अन्यथा कॉन्फ़िगर किए जाने तक)। [लॉगर पदानुक्रम देखें] (https://logging.apache.org/log4j/1.2/manual.html) – oers

39

ऐसा लगता है कि आप "दोनों सिरों" (उपभोक्ता अंत और कॉन्फ़िगरेशन अंत) से log4j का उपयोग करने का प्रयास कर रहे हैं।

आप slf4j एपीआई के खिलाफ कोड लेकिन समय से आगे का निर्धारण (और प्रोग्राम के रूप में) करने के लिए log4j संग्रह करने वालों कि classpath वापस आ जाएगी के विन्यास चाहते हैं, आप बिल्कुल जो का उपयोग करता है लॉगिंग अनुकूलन किसी प्रकार का होना चाहिए आलसी निर्माण।

public class YourLoggingWrapper { 
    private static boolean loggingIsInitialized = false; 

    public YourLoggingWrapper() { 
     // ...blah 
    } 

    public static void debug(String debugMsg) { 
     log(LogLevel.Debug, debugMsg); 
    } 

    // Same for all other log levels your want to handle. 
    // You mentioned TRACE and ERROR. 

    private static void log(LogLevel level, String logMsg) { 
     if(!loggingIsInitialized) 
      initLogging(); 

     org.slf4j.Logger slf4jLogger = org.slf4j.LoggerFactory.getLogger("DebugLogger"); 

     switch(level) { 
     case: Debug: 
      logger.debug(logMsg); 
      break; 
     default: 
      // whatever 
     } 
    } 

    // log4j logging is lazily constructed; it gets initialized 
    // the first time the invoking app calls a log method 
    private static void initLogging() { 
     loggingIsInitialized = true; 

     org.apache.log4j.Logger debugLogger = org.apache.log4j.LoggerFactory.getLogger("DebugLogger"); 

     // Now all the same configuration code that @oers suggested applies... 
     // configure the logger, configure and add its appenders, etc. 
     debugLogger.addAppender(someConfiguredFileAppender); 
    } 

इस दृष्टिकोण के साथ, आपको इस बारे में चिंता करने की आवश्यकता नहीं है कि आपके log4j लॉगर्स कहां कॉन्फ़िगर किए गए हैं। पहली बार क्लासपाथ उनसे पूछता है, वे आलसी रूप से निर्मित होते हैं, वापस पास हो जाते हैं और slf4j के माध्यम से उपलब्ध कराते हैं। उम्मीद है कि यह मदद की!

+1

इसे पकड़ा! एक सहायक उदाहरण के लिए बहुत बहुत धन्यवाद[email protected] - मुझे सही दिशा में चलाने की कोशिश करने के लिए धन्यवाद - मैं आपको अपने समर्पण के लिए हरे रंग की जांच करने जा रहा हूं लेकिन मुझे झारवे को बक्षीस देना होगा क्योंकि यह वही था जो मैं ढूंढ रहा था। फिर सबको धन्यवाद! – IAmYourFaja

0

यदि आपने log4j गुणों में एक एपेंडर परिभाषित किया है और इसे प्रोग्रामेटिक रूप से अपडेट करना चाहते हैं, तो log4j गुणों में नाम सेट करें और इसे नाम से प्राप्त करें।

log4j.appender.stdout.Name=console 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.Threshold=INFO 

इसे अद्यतन करने के लिए, निम्न करें::

यहाँ एक उदाहरण log4j.properties प्रविष्टि है

((ConsoleAppender) Logger.getRootLogger().getAppender("console")).setThreshold(Level.DEBUG); 
संबंधित मुद्दे