2011-10-28 18 views
5

मैं जानना चाहता हूं कि java.util.logging एपीआई का उपयोग कैसे करें, ताकि उपयोग किए गए स्तर के आधार पर विभिन्न लॉग फ़ाइल में लॉग संदेश लिखा जा सके। यदि स्तर INFO है तो मैं /log/info.log में संदेश भेजना चाहता हूं और इसी तरह। 3 परिभाषित स्तर गंभीर, चेतावनी और जानकारी हैं।फ़ाइलों को अलग करने के लिए विभिन्न स्तरों को लॉग करने के लिए java.util.logging API का उपयोग

+0

जो जावा लॉगिंग एपीआई आप उपयोग कर रहे हैं? Log4j के लिए, जावा उपयोग लॉगिंग और slf4j आप एपेंडर सेट कर सकते हैं जो आप चाहते हैं, लेकिन कॉन्फ़िगरेशन उनमें से प्रत्येक के लिए अलग है। – sbridges

+0

क्षमा करें, मैं Log4j का उपयोग नहीं कर रहा हूं, लेकिन मैं jdk द्वारा प्रदान किए गए जावा लॉगिंग एपीआई का उपयोग कर रहा हूं। – xtrem06

उत्तर

3

आप लॉग रिकॉर्ड्स लिखने के लिए कस्टम Handlers का उपयोग करते हैं।

यहां एक सरल, लेकिन पूरा उदाहरण है जिसे आप बना सकते हैं।

import java.io.IOException; 
import java.util.logging.FileHandler; 
import java.util.logging.Level; 
import java.util.logging.LogRecord; 

public class LevelBasedFileHandler extends FileHandler 
{ 
    public LevelBasedFileHandler(final Level level) throws IOException, SecurityException 
    { 
     super(); 
     super.setLevel(level); 
    } 

    public LevelBasedFileHandler(final String s, final Level level) throws IOException, SecurityException 
    { 
     super(s); 
     super.setLevel(level); 
    } 

    public LevelBasedFileHandler(final String s, final boolean b, final Level level) throws IOException, SecurityException 
    { 
     super(s, b); 
     super.setLevel(level); 
    } 

    public LevelBasedFileHandler(final String s, final int i, final int i1, final Level level) throws IOException, SecurityException 
    { 
     super(s, i, i1); 
     super.setLevel(level); 
    } 

    public LevelBasedFileHandler(final String s, final int i, final int i1, final boolean b, final Level level) throws IOException, SecurityException 
    { 
     super(s, i, i1, b); 
     super.setLevel(level); 
    } 

    @Override 
    public void setLevel() { throw new UnsupportedOperationException("Can't change after construction!"); } 

    // This is the important part that makes it work 
    // it also breaks the contract in the JavaDoc for FileHandler.setLevel() 
    @Override 
    public void publish(final LogRecord logRecord) 
    { 
     if (logRecord.getLevel().equals(super.getLevel()) 
     { 
      super.publish(logRecord); 
     } 
    } 
} 

और यहाँ है कि यह कैसे

try 
{ 
    // I use the Anonymous logger here, but any named logger will work as well 
    final Logger l = Logger.getAnonymousLogger(); 
    l.addHandler(new LevelBasedFileHandler("/tmp/info.log", Level.INFO)); 
    l.addHandler(new LevelBasedFileHandler("/tmp/warn.log", Level.WARNING)); 
    l.addHandler(new LevelBasedFileHandler("/tmp/server.log", Level.SEVERE)); 

    l.info("This is an INFO message"); 
    l.warning("This is a WARNING message"); 
    l.severe("This is a SEVERE message"); 
} 
catch (final IOException e) 
{ 
    // ignore this for this example, you should never do this in real code 
} 

उपयोग करने के लिए आप उन्हें में एक विशेष लॉग स्तर के लिए केवल संदेश के साथ /tmp प्रत्येक में तीन फ़ाइलें प्राप्त होगा।

नोट, मुझे कन्स्ट्रक्टर में Level की आवश्यकता के निर्भरता इंजेक्शन शैली दृष्टिकोण पसंद है, इसलिए आप इस उप-वर्ग का उपयोग करते समय .setLevel() पर कॉल करने के लिए "भूल" नहीं सकते। मैं भी .setLevel() अक्षम यह बुला और उपवर्ग "का अर्थ विज्ञान टूट जाएगा बदल रहा है क्योंकि

बस संपूर्णता के लिए आप एक java.util.logging.Filter एक ही बात पूरा करने के लिए उपयोग कर सकते हैं। यह रूप में समझाया, लेकिन यह एक विकल्प है नहीं है। यह अधिक है कोड और, और अधिक वर्बोज़ इस प्रकार अधिक सही नहीं मिलता है।

final FileHandler infoFileHandler = new FileHandler("/tmp/info.log"); 
infoFileHandler.setFilter(new Filter() 
{ 
    public boolean isLoggable(final LogRecord logRecord) 
    { 
     return logRecord.getLevel().equals(Level.INFO); 
    } 
}); 

व्यक्तिगत तौर पर मैं अभी भी उप-वर्ग दृष्टिकोण बेहतर की तरह, यह त्रुटियों की संभावना कम और इसके उद्देश्य और इरादे के रूप में और अधिक आत्म दस्तावेज़ीकृत है।

+0

धन्यवाद अच्छा जवाब। – xtrem06

+0

आपको 'लेवलबेसेडफाइलहैंडलर' की आवश्यकता नहीं है क्योंकि प्रत्येक हैंडल में 'सेटलेवल' है। बस 'एच = नया फाइल हैंडलर (...); h.setLevel (...) ' – bestsss

+0

@bestss setLevel() केवल ** निचले ** स्तर संदेशों पर प्रतिबंधित है, लेकिन उच्च स्तर के संदेशों को स्वीकार करता है। उस पर जावाडोक पढ़ें। "लॉग हैंडल सेट करें जो निर्दिष्ट करता है कि इस हैंडलर द्वारा कौन से संदेश स्तर लॉग किए जाएंगे। इस मान से कम संदेश स्तर को त्याग दिया जाएगा।" आवश्यकता ** केवल ** निर्दिष्ट स्तर है। –

-1

मान लें कि आप लॉग लॉग करने के लिए log4j का उपयोग करते हैं। आपको एक कस्टम एपेंडर लिखना होगा, और इसे प्रत्येक लॉगर में जोड़ना होगा।

  • सरल निर्देश

कस्टम appender में, आप बस एक अगर बयान है कि लॉग प्रकार को देखता है, और आवश्यक कार्रवाई करता है। विशेष रूप से, फाइल ऐपेंडेंडर हैं जिन्हें इस आवश्यकता को बहुत स्वाभाविक रूप से समायोजित करने के लिए बढ़ाया जा सकता है। http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/FileAppender.html

  • अधिक सुरुचिपूर्ण उदाहरण

के बजाय अपने खुद के कोडन, बस सेटअप करने के लिए एक कॉन्फ़िग फ़ाइल की कोशिश करो!

http://www.vaannila.com/log4j/log4j-file-appender-example-1.html

यह तुम क्या जरूरत है वास्तव में ऐसा करेंगे।

+0

ठीक है, क्या यह jdk द्वारा प्रदान की गई लॉगिंग एपीआई के साथ ऐसा करना संभव है? – xtrem06

+0

असल में, उदाहरण में प्रदान किया गया समाधान, वह नहीं है जिसे मैं प्राप्त करना चाहता हूं, खासकर कॉन्फ़िगर फ़ाइल के साथ। इस समाधान में, फ़ाइल या दूसरे पर एक संदेश लॉगिंग आपके द्वारा किए गए पैकेज पर निर्भर करता है। – xtrem06

0

चूंकि हर कोई log4j के बारे में बताता है ... यहां एक और उपयोगी उत्तर है:

विभिन्न हैंडल (फ़ाइलों के लिए फ़ाइल हैंडलर) जोड़ें और हैंडलर पर स्तर सेट करें। लॉगर के स्तर को हैंडलर को पास करने के लिए सबसे अधिक वर्बोज़/आराम करने की अनुमति है।

मैं jul.Logger सेट करने के लिए गुण फ़ाइल का उपयोग नहीं करता लेकिन केवल कुछ घर-ब्रूड xml। यदि आप गुण फ़ाइल के माध्यम से ऐसा नहीं कर सकते हैं, तो बस लॉगर का उपयोग करें।getHandler() प्राप्त करें और उचित स्तर निर्धारित करें।

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

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