2013-12-13 11 views
6

मुझे प्रोग्राम एपेंडर प्रोग्रामेटिक रूप से सेट करने की आवश्यकता है।LOG4J2 - प्रोग्राम एपेंडर प्रोग्रामेटिक रूप से कैसे बनाएं?

मैं अपने परिशिष्ट log4j2.xml पर सेट करना चाहता हूं लेकिन मैं रनटाइम पर केवल इन परिशिष्टों में से एक को (प्रोग्रामेटिक रूप से) लिखना चाहता हूं।

<Configuration status="WARN"> 
<Appenders> 
    <File name="File_1" fileName="c:/FILE_1.log" > 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </File> 
    <File name="File_2" fileName="c:/FILE_2.log" > 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </File> 
    <File name="File_3" fileName="c:/FILE_3.log" > 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </File> 
</Appenders> 
<Loggers> 
    <Root level="debug"> 
     <AppenderRef ref="File_1"/> 
     <AppenderRef ref="File_2"/> 
     <AppenderRef ref="File_3"/> 
    </Root> 
</Loggers> 

उदाहरण:

 if(condition.equals("A")){ 
      //write log on File_1 
     }else if(condition.equals("B")){ 
       //write log on File_2 
     }else { 
       //write log on File_3 
     } 

इंटरनेट में विभिन्न ट्यूटोरियल वे रनटाइम पर प्रोग्राम के रूप में appenders जोड़ने के बारे में समझाने पर देख रहे हैं; क्या एक्सएमएल कॉन्फ़िगरेशन फ़ाइल में परिभाषित एपेंडर्स में से केवल एक रनटाइम पर चुनने का कोई तरीका है?

एक पहला समाधान:

मैं निम्नलिखित तरीके से समस्या को हल करने की कोशिश की है, लेकिन मैं अपने समाधान से संतुष्ट नहीं हूँ क्योंकि फ़ाइलें log4j2.xml में परिभाषित प्रोग्राम के रूप में और नहीं निकाले जाते पहला एपेंडर कभी नहीं हटाया जाता है! मुझे लगता है कि log4j2 में एक बग है: https://issues.apache.org/jira/browse/LOG4J2-135 (स्थिति हल है, लेकिन मैं ऐसा नहीं सोचता ... मैं log4j-2.0-beta9 उपयोग कर रहा हूँ)

static org.apache.logging.log4j.core.Logger coreLogger =  
(org.apache.logging.log4j.core.Logger)LogManager.getLogger(MyClass.class.getName()); 
static LoggerContext context = (LoggerContext)coreLogger.getContext(); 
static BaseConfiguration configuration = (BaseConfiguration)context.getConfiguration(); 

static String FILE_1 = "File_1"; 
static String FILE_2 = "File_2"; 
static String FILE_3 = "File_3"; 

private static Map<String, Boolean> appendersMap; 
static 
{ 
    appendersMap = new HashMap<String, Boolean>(); 
    appendersMap.put(FILE_1, true); 
    appendersMap.put(FILE_2, true); 
    appendersMap.put(FILE_3, true); 
} 

/** 
* Configure appenders. 
* 
* @param appender the appender 
*/ 
public static void configureAppenders(String appender){ 

    if(appender.equals(FILE_1)){ 
     addAppenders(FILE_1); 
     removeAppenders(FILE_2,FILE_3); 
    } 

    else if(appender.equals(FILE_3)){ 
     addAppenders(FILE_3); 
     removeAppenders(FILE_1,FILE_2); 
    } 

    else if(appender.equals(FILE_2)){ 
     addAppenders(FILE_2); 
     removeAppenders(FILE_1,FILE_3); 
    } 

} 

private static void addAppenders(String appender){ 
    if (!appendersMap.get(appender)){ 
     appendersMap.put(appender, true); 
     coreLogger.addAppender(configuration.getAppender(appender)); 
    } 
} 

private static void removeAppenders(String... appenders){ 
    for(String appender : appenders){ 
     appendersMap.put(appender, false); 
     coreLogger.removeAppender(configuration.getAppender(appender)); 
    } 
} 
+1

सिस्को, दोस्त ने आपके कोड को इतना मदद की। जब तक मैंने आपका कोड नहीं देखा तब तक मैं अपने परिशिष्ट संलग्न करने में असमर्थ था। –

उत्तर

1

थोड़ा समय के बाद से यह सवाल पूछा गया था किया गया है, और अनुरोध log4j 2. के लिए बेहतर कार्यक्रम संबंधी विन्यास का समर्थन करने के log4j 2.4 के रूप में की एक संख्या वहाँ किया गया है, एपीआई के log4j कोर में जोड़ा गया था programmatic configuration की सुविधा।

नया ConfigurationBuilder एपीआई उपयोगकर्ताओं को घटक परिभाषा बनाने की अनुमति देता है। इस एपीआई के साथ, वास्तविक कॉन्फ़िगरेशन ऑब्जेक्ट्स (जैसे लॉगर कॉन्फिग और फ़ाइल एपेंडर) के साथ सीधे काम करने की आवश्यकता नहीं है, जिसके लिए लॉग 4j हुड के नीचे काम करता है, इस बारे में बहुत सारी जानकारी की आवश्यकता होती है। घटक परिभाषाएं कॉन्फ़िगरेशनबिल्डर में जोड़ दी जाती हैं, और एक बार सभी परिभाषाओं को एकत्रित करने के बाद सभी वास्तविक कॉन्फ़िगरेशन ऑब्जेक्ट्स (जैसे लॉगर्स और परिशिष्ट) का निर्माण किया जाता है। यह एक्सएमएल कॉन्फ़िगरेशन सिंटैक्स की तरह थोड़ा सा लगता है, सिवाय इसके कि आप जावा कोड लिख रहे हैं।

ध्यान दें कि नई ConfigurationBuilder एपीआई करने के लिए उपयोगकर्ता कोड एक नया विन्यास बना सकते हैं या पूरी तरह से मौजूदा विन्यास को बदलने की अनुमति देता है। यदि आपका उपयोग केस अलग है, और आप प्रोग्रामेटिक रूप से लॉग 4j शुरू होने के बाद मौजूदा कॉन्फ़िगरेशन (प्रतिस्थापित करने के बजाय) को संशोधित करना चाहते हैं, तो आपको वास्तविक कॉन्फ़िगरेशन ऑब्जेक्ट्स के साथ काम करने की आवश्यकता होगी। उस स्थिति में, मैनुअल के Programmatically Modifying the Current Configuration after Initialization अनुभाग देखें।

आप आंतरिक विन्यास वस्तुओं के साथ सीधे काम जरूरत करना तो कृपया ध्यान रखें कि आप अपने परिवर्तनों को प्रभावी बनाने के लिए अंत में या तो LoggerContext.updateLoggers() या Configurator.initialize(Configuration) कॉल करने के लिए की जरूरत है।उदाहरण के लिए:

final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); 
final Configuration config = ctx.getConfiguration(); 
... // make changes 
ctx.updateLoggers(); // NECESSARY! 
0

यह मेरे लिए काम कर रहा है। सुनिश्चित नहीं है कि कैसे। मैंने लॉगर्स को अपडेट नहीं किया है और न ही एक संदर्भ पुन: कॉन्फ़िगर किया है।

Logger coreLogger = (Logger)LogManager.getLogger(LoggingStuff.class.getName()); 
    Layout layout = ((LoggerContext)LogManager.getContext()).getConfiguration().getAppender("Console").getLayout(); 
    Appender appender = FileAppender.newBuilder().withName("File").withFileName("target/bash.log").withLayout(layout).build(); 
    appender.start(); 
    coreLogger.addAppender(appender); 
+0

सुनिश्चित नहीं है, तो आप इसे उत्तर के रूप में कैसे पोस्ट कर सकते हैं? – Billa

+0

अच्छी तरह से, यह नौकरी करता है। लेकिन यह काम कैसे उपयोगी होगा इस पर कोई स्पष्टीकरण। – Ash

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