2011-11-03 13 views
6

नाम देने के लिए एमडीसी का उपयोग करना क्या यह संभव है कि रन टाइम पर लॉग फ़ाइल नाम देने के लिए एमडीसी का उपयोग कैसे करें।लॉग फ़ाइल को गतिशील रूप से लॉग फ़ाइल

मेरे पास एक ही वेब एप्लिकेशन है जिसे टॉमकैट डॉकबेस का उपयोग करके एक ही समय में अलग-अलग नामों से बुलाया जा रहा है। तो मुझे उनमें से प्रत्येक के लिए अलग लॉग फाइलों की आवश्यकता है।

उत्तर

10

यह Logback में लॉग 4J के उत्तराधिकारी में पूरा किया जा सकता है।

लॉगबैक लोकप्रिय log4j प्रोजेक्ट के उत्तराधिकारी के रूप में लक्षित है, जहां log4j छोड़ देता है।

के लिए Sifting Appender

प्रलेखन SiftingAppender अपनी क्षमता का संदर्भ और नेस्टेड appenders कॉन्फ़िगर करने के लिए में अद्वितीय है देखें। उपर्युक्त उदाहरण में, SiftingAppender के भीतर फ़ाइल एपेंडर उदाहरणों को निहित किया जाएगा, प्रत्येक उपयोगकर्ता को "userid" MDC कुंजी से जुड़े मान द्वारा पहचाना जाएगा। जब भी "उपयोगकर्ता आईडी" एमडीसी कुंजी को एक नया मान सौंपा जाता है, तो एक नया फ़ाइल ऐपेंडर इंस्टेंस स्क्रैच से बनाया जाएगा। SiftingAppender यह बनाता है कि appenders का ट्रैक रखता है। 30 मिनट के लिए अप्रयुक्त परिशिष्ट स्वचालित रूप से बंद हो जाएंगे और त्याग दिए जाएंगे।

उदाहरण में, वे प्रत्येक उपयोगकर्ता के लिए एमडीसी मूल्य के आधार पर एक अलग लॉग फ़ाइल उत्पन्न करते हैं। अन्य एमडीसी मूल्यों का उपयोग आपकी आवश्यकताओं के आधार पर किया जा सकता है।

+0

लेकिन लॉगबैक का उपयोग करने का मतलब यह होगा कि सभी लॉगिंग विवरणों को सही ढंग से बदला जाना चाहिए? ' –

+1

http://slf4j.org/legacy.html – Ceki

9

यह log4j के साथ भी संभव है। आप अपने स्वयं के एपेंडर को लागू करके ऐसा कर सकते हैं। मुझे लगता है कि सबक्लास AppenderSkeleton का सबसे आसान तरीका है।

सभी लॉगिंग ईवेंट append(LoggingEvent event) विधि में लागू होते हैं जो आपको लागू करना है।

कि विधि आप द्वारा event.getMDC("nameOfTheKeyToLookFor");

MDC उपयोग कर सकते हैं तो फिर आप फ़ाइल पर लिखने में खोलने के लिए इस जानकारी का इस्तेमाल कर सकते हैं में। शेष पता लगाने के लिए RollingFileAppender जैसे मानक परिशिष्टों के कार्यान्वयन पर ध्यान देना उपयोगी हो सकता है।

मैंने अलग-अलग धागे के लॉग को अलग-अलग लॉग फ़ाइलों में अलग करने के लिए अपने आप को इस एप्लिकेशन का उपयोग किया और यह बहुत अच्छी तरह से काम किया।

+0

पर ब्रिजिंग विरासत API देखें I रोलिंगफ़ाइलएपेंडर का उपयोग नहीं कर रहा हूं। क्या यह FileAppender में संभव है? –

+0

मैंने रोलिंगफाइलएपेंडर का उल्लेख केवल एक एपेंडर को कार्यान्वित करने के उदाहरण के रूप में किया है।मूल रूप से आप जो कुछ भी आप चाहते हैं उसे जोड़ सकते हैं। – Wolfgang

5

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

// this can be any thread-specific string 
String processID = request.getProcessID(); 

Logger logger = Logger.getRootLogger(); 

// append a new file logger if no logger exists for this tag 
if(logger.getAppender(processID) == null){ 

    try{ 
    String pattern = "%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n"; 
    String logfile = "log/"+processID+".log"; 

    FileAppender fileAppender = new FileAppender(
     new PatternLayout(pattern), logfile, true); 
    fileAppender.setName(processID); 

    // add a filter so we can ignore any logs from other threads 
    fileAppender.addFilter(new ProcessIDFilter(processID)); 

    logger.addAppender(fileAppender); 
    }catch(Exception e){ 
    throw new RuntimeException(e); 
    } 
} 

// tag all child threads with this process-id so we can separate out log output 
MDC.put("process-id", processID); 

//whatever you want to do in the thread 
LOG.info("This message will only end up in "+processID+".log!"); 

MDC.remove("process-id"); 

फिल्टर बस ऊपर संलग्न एक विशिष्ट प्रक्रिया आईडी की जांच करता है:

public class RunIdFilter extends Filter { 

    private final String runId; 

    public RunIdFilter(String runId) { 
    this.runId = runId; 
    } 

    @Override 
    public int decide(LoggingEvent event) { 
    Object mdc = event.getMDC("run-id"); 

    if (runId.equals(mdc)) { 
     return Filter.ACCEPT; 
    } 

    return Filter.DENY; 
    } 
} 

आशा है कि यह एक बिट में मदद करता है।

+0

मैं लॉग 4j 2 में एक ही फ़िल्टर कैसे लिखूं? –

+0

पहले ब्लॉक में कोड जोड़ने के लिए कहां? – NaiveCoder

+0

@NiveCoder कहीं भी आप एमडीसी फ़िल्टरिंग शुरू करना चाहते हैं। – bpodgursky

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