मैं जानना चाहता हूं कि java.util.logging
एपीआई का उपयोग कैसे करें, ताकि उपयोग किए गए स्तर के आधार पर विभिन्न लॉग फ़ाइल में लॉग संदेश लिखा जा सके। यदि स्तर INFO है तो मैं /log/info.log में संदेश भेजना चाहता हूं और इसी तरह। 3 परिभाषित स्तर गंभीर, चेतावनी और जानकारी हैं।फ़ाइलों को अलग करने के लिए विभिन्न स्तरों को लॉग करने के लिए java.util.logging API का उपयोग
उत्तर
आप लॉग रिकॉर्ड्स लिखने के लिए कस्टम 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);
}
});
व्यक्तिगत तौर पर मैं अभी भी उप-वर्ग दृष्टिकोण बेहतर की तरह, यह त्रुटियों की संभावना कम और इसके उद्देश्य और इरादे के रूप में और अधिक आत्म दस्तावेज़ीकृत है।
धन्यवाद अच्छा जवाब। – xtrem06
आपको 'लेवलबेसेडफाइलहैंडलर' की आवश्यकता नहीं है क्योंकि प्रत्येक हैंडल में 'सेटलेवल' है। बस 'एच = नया फाइल हैंडलर (...); h.setLevel (...) ' – bestsss
@bestss setLevel() केवल ** निचले ** स्तर संदेशों पर प्रतिबंधित है, लेकिन उच्च स्तर के संदेशों को स्वीकार करता है। उस पर जावाडोक पढ़ें। "लॉग हैंडल सेट करें जो निर्दिष्ट करता है कि इस हैंडलर द्वारा कौन से संदेश स्तर लॉग किए जाएंगे। इस मान से कम संदेश स्तर को त्याग दिया जाएगा।" आवश्यकता ** केवल ** निर्दिष्ट स्तर है। –
मान लें कि आप लॉग लॉग करने के लिए 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
यह तुम क्या जरूरत है वास्तव में ऐसा करेंगे।
ठीक है, क्या यह jdk द्वारा प्रदान की गई लॉगिंग एपीआई के साथ ऐसा करना संभव है? – xtrem06
असल में, उदाहरण में प्रदान किया गया समाधान, वह नहीं है जिसे मैं प्राप्त करना चाहता हूं, खासकर कॉन्फ़िगर फ़ाइल के साथ। इस समाधान में, फ़ाइल या दूसरे पर एक संदेश लॉगिंग आपके द्वारा किए गए पैकेज पर निर्भर करता है। – xtrem06
चूंकि हर कोई log4j के बारे में बताता है ... यहां एक और उपयोगी उत्तर है:
विभिन्न हैंडल (फ़ाइलों के लिए फ़ाइल हैंडलर) जोड़ें और हैंडलर पर स्तर सेट करें। लॉगर के स्तर को हैंडलर को पास करने के लिए सबसे अधिक वर्बोज़/आराम करने की अनुमति है।
मैं jul.Logger सेट करने के लिए गुण फ़ाइल का उपयोग नहीं करता लेकिन केवल कुछ घर-ब्रूड xml। यदि आप गुण फ़ाइल के माध्यम से ऐसा नहीं कर सकते हैं, तो बस लॉगर का उपयोग करें।getHandler() प्राप्त करें और उचित स्तर निर्धारित करें।
- 1. java.util.logging से अलग जानकारी और ERROR लॉग
- 2. विभिन्न जेडीएसई संस्करणों के लिए विभिन्न जेडीके का उपयोग करने के लिए मेवेन को कॉन्फ़िगर करें?
- 3. विभिन्न एपीआई स्तरों के लिए विभिन्न जावा विधियां
- 4. घुमावदार लॉग फ़ाइलों को संपीड़ित करने के लिए एक उपयोगिता?
- 5. विभिन्न फ़ोल्डर्स में लॉग के बहुत सारे पार्स को पार्स करने के लिए लॉग पार्सर का उपयोग
- 6. लॉग फ़ाइलों को संग्रहीत करने के लिए बैश स्क्रिप्ट
- 7. मैं रजिस्ट्री स्तर को लॉग इन करने के लिए लॉगबैक.groovy फ़ाइल का उपयोग कैसे करूं और
- 8. विभिन्न जेनेरिकों को निर्दिष्ट करने के लिए
- 9. लॉग फ़ाइलों को रोल करने के लिए टॉमकैट जुली लॉगिंग को कॉन्फ़िगर कैसे करें?
- 10. फ़ाइलों को एन्क्रिप्ट/डिक्रिप्ट करने के लिए रिजेंडेल का उपयोग
- 11. djcelery के साथ celeryd के लिए लॉग फ़ाइलों के घूर्णन को सक्षम करने के लिए कैसे?
- 12. फ़ाइलों को एन्क्रिप्ट करने के लिए उपयोग की जाने वाली कुंजी को संग्रहीत करने के लिए
- 13. प्रति शाखा प्रकार Git लॉग --decorate के अलग अलग रंग का अनुकरण करने के लिए कैसे
- 14. विभिन्न प्लेटफार्मों के लिए रत्नों के विभिन्न संस्करणों को लोड करने के लिए बंडलर का उपयोग करके
- 15. फ़ाइलों को लॉग इन करने के लिए सापेक्ष पथ का उपयोग करना Pylons 'develop.ini
- 16. फ़ाइलों को संपीड़ित करने के लिए
- 17. फ़ाइलों का उपयोग प्रतिबंधित करने के लिए .htaccess का उपयोग
- 18. फ़ाइलों को एक अलग उपनिर्देशिका में कॉपी करने के लिए मैपर और फाइलसेट का उपयोग करना?
- 19. फ़ोल्डर को हटाने के लिए उपयोग करने के लिए Win32 API फ़ंक्शन क्या है?
- 20. विभिन्न स्टाइल लाइनों को आकर्षित करने के लिए MKPolyLineView को कस्टमाइज़ करने के लिए कैसे करें
- 21. विरासत को व्यक्त करने के लिए अलग-अलग नोटेशन
- 22. उपयोगकर्ता को एसएमएस का उपयोग करने के लिए मोबाइल ब्राउजर का उपयोग करने के लिए एसएमएस
- 23. एकाधिक .gitignore फ़ाइलों का उपयोग करने के लिए सर्वोत्तम अभ्यास
- 24. ऑफ़लाइन एक्सेस के लिए फ़ाइलों को स्टोर करने के लिए एचटीएमएल 5 वेब डेटाबेस का उपयोग
- 25. मेरे संसाधनों को लोड करने के लिए एनएसबंडल का उपयोग
- 26. ग्रहण: अलग-अलग खुले कार्यक्षेत्रों को अलग/अलग करने के लिए कैसे करें
- 27. Android में विभिन्न लेआउट के लिए अलग-अलग प्रोग्रामिंग तर्कों को अलग करने का सबसे अच्छा तरीका क्या है?
- 28. सी # में 3 स्तरों वास्तुकला लागू करने के लिए कैसे
- 29. सी ++: टाइप दो सुरक्षा के प्रकारों को अलग करने के लिए प्रकार सुरक्षा का उपयोग
- 30. उपयोगकर्ता-एजेंटों को प्रतिबंधित करने के लिए web.config का उपयोग
जो जावा लॉगिंग एपीआई आप उपयोग कर रहे हैं? Log4j के लिए, जावा उपयोग लॉगिंग और slf4j आप एपेंडर सेट कर सकते हैं जो आप चाहते हैं, लेकिन कॉन्फ़िगरेशन उनमें से प्रत्येक के लिए अलग है। – sbridges
क्षमा करें, मैं Log4j का उपयोग नहीं कर रहा हूं, लेकिन मैं jdk द्वारा प्रदान किए गए जावा लॉगिंग एपीआई का उपयोग कर रहा हूं। – xtrem06