Java.util.log [बंद] का उपयोग करके अच्छे उदाहरण


273

मैं अपने प्रोग्राम में लॉग का उपयोग करना चाहता हूं। मैंने java.util.log के बारे में सुना , लेकिन मुझे नहीं पता कि कैसे शुरू किया जाए।

क्या कोई उदाहरण है कि मैं लॉगिंग के साथ क्या कर सकता हूं? मैं अपने कार्यक्रम में लॉगिंग का उपयोग कैसे करूंगा?


7
आप यहां शुरू कर सकते हैं: slf4j.org/manual.html
जेरेमी

1
मैं स्टीवन वास्केलारो से सहमत हूं। बिना किसी व्यावहारिक अंत के विषय पुलिसिंग के कारण नष्ट की गई सहायक वस्तुओं को देखकर मैं थक गया हूं। इसके अतिरिक्त, जेरेमी के साथ सम्मानजनक रूप से असहमत हैं, क्योंकि ओपी ने java.util.log के बारे में पूछा था। मुझे देशी लॉगिंग में भी दिलचस्पी है (उत्तर के लिए धन्यवाद, जीआरएन!)
एनओपी

एक पंक्ति में डेटा लॉग करने के लिए: log.log (Level.INFO, "मेरा संदेश {0}", नई वस्तु [] {myDataId});
मितजा गुस्टिन

जवाबों:


335

java.util.logging आप अपने आवेदन के साथ चारों ओर एक और जार फ़ाइल ले जाने के लिए रहता है, और यह एक अच्छा प्रारूप के साथ अच्छी तरह से काम करता है।

सामान्य तौर पर, हर वर्ग के शीर्ष पर , आपके पास होना चाहिए:

private static final Logger LOGGER = Logger.getLogger( ClassName.class.getName() );

फिर, आप केवल लकड़हारा वर्ग की विभिन्न सुविधाओं का उपयोग कर सकते हैं ।


निष्पादन प्रवाह के शीर्ष स्तर पर डिबगिंग वाली Level.FINEकिसी भी चीज़ के लिए उपयोग करें :

LOGGER.log( Level.FINE, "processing {0} entries in loop", list.size() );

छोरों का उपयोग करें Level.FINER/ Level.FINESTअंदर और उन जगहों पर जहां आपको मूल प्रवाह मुद्दों को डीबग करते समय हमेशा उस विवरण को देखने की आवश्यकता नहीं हो सकती है:

LOGGER.log( Level.FINER, "processing[{0}]: {1}", new Object[]{ i, list.get(i) } );

लॉगिंग सुविधाओं के पैरामीटरित संस्करणों का उपयोग करें ताकि टन के स्ट्रिंग कंक्रीटिंग कचरे को उत्पन्न किया जा सके, जिसे GC को साथ रखना होगा। Object[]जैसा कि ऊपर सस्ता है, आमतौर पर स्टैक आवंटन पर।


अपवाद हैंडलिंग के साथ, हमेशा पूर्ण अपवाद विवरण लॉग करें:

try {
    ...something that can throw an ignorable exception
} catch( Exception ex ) {
    LOGGER.log( Level.SEVERE, ex.toString(), ex );
}

मैं हमेशा ex.toString()संदेश के रूप में यहां से गुजरता हूं , क्योंकि तब जब मैं लॉग फाइल में " grep -n" के लिए " Exception" हूं, तो मैं संदेश भी देख सकता हूं। अन्यथा, यह स्टैक डंप द्वारा उत्पन्न आउटपुट की अगली पंक्ति पर होने वाला है, और आपके पास उस लाइन से मेल खाने के लिए एक अधिक उन्नत RegEx भी होना चाहिए, जो अक्सर आपको देखने के लिए ज़रूरत से ज़्यादा आउटपुट प्राप्त करता है।


3
क्या यह किसी प्रकार की फ़ाइल में लिखता है। मैं इसे अभी तक अपने कार्यक्रम में काम नहीं कर सका। मेरे पास प्रारंभिक लाइन है जो आपके पास है लेकिन अभी तक कुछ भी काम नहीं किया गया है।
डग Hauf

5
आप लॉग को कैसे देखते हैं? एक पुस्तकालय मैं लकड़हारा वस्तुओं को इनिशियलाइज़ कर रहा हूं और .fine()लॉग करने की विधि का उपयोग करता हूं, लेकिन मैं संदेश प्रदर्शित करने के लिए प्रतीत नहीं कर सकता ...
Anubian Noob

7
मैं 1998 से जावा में प्रोग्रामिंग कर रहा हूं। मैंने हमेशा जावा में लॉगिंग पाया है कि यह एक सिरदर्द की तुलना में बहुत अधिक है। यह अब तक जावा में लॉग इन करने का सबसे सरल स्पष्टीकरण है जो मैंने पढ़ा है। संक्षिप्त भी करें।
स्टीव मैक्लियॉड

30
यह दिलचस्प है कि किसी ने उल्लेख नहीं किया है, जहां कोई लॉग फ़ाइलों को ढूंढ सकता है।
अहमदोव

4
यदि आप सोच रहे हैं कि लॉग कहाँ जाते हैं, तो सुनिश्चित करें कि आपने लॉगर के लिए एक हैंडलर स्थापित किया है। बस कंसोल में लॉग को आउटपुट करने के लिए, एक नया कंसोलहैंडलर का उपयोग करें, और एडहैंडलर विधि का उपयोग करके इसे अपने लकड़हारे में जोड़ें। सुनिश्चित करें कि आप लकड़हारा और हैंडलर दोनों पर सेटलेवल कहते हैं।
क्रेग ब्राउन

67

इस तरह लकड़हारा घोषित करना चाहिए:

private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());

इसलिए यदि आप अपने वर्ग के नाम का उल्लेख करते हैं तो यह इस प्रकार है।

मैंने यहाँ उदाहरण के साथ जावा लकड़हारा के बारे में एक लेख लिखा था ।


53

लॉगिंग के लिए कई उदाहरण और विभिन्न प्रकार के भी हैं। Java.util.log पैकेज पर एक नज़र डालें ।

उदाहरण कोड:

import java.util.logging.Logger;

public class Main {

  private static Logger LOGGER = Logger.getLogger("InfoLogging");

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}

वर्ग नाम के बिना हार्ड-कोडिंग :

import java.util.logging.Logger;

public class Main {
  private static final Logger LOGGER = Logger.getLogger(
    Thread.currentThread().getStackTrace()[0].getClassName() );

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}

15
लॉग नाम के रूप में सेटिंग क्यों नहीं Main.class.getSimpleName()? इस तरह से रीफैक्टरिंग टूल इसे सही तरीके से बदलने की जरूरत है और यदि अभी तक, यह आपके दूसरे समाधान के रूप में क्लंकी नहीं है।
पीज्यूसन

3
एक लकड़हारा नाम के लिए स्टैकट्रेस करना हैक, धीमा और अपरंपरागत है। यह भी तोड़ देगा और आपको AOP परदे के पीछे या अन्य बाइट कोडिंग असाधारण के लिए अजीब नाम देगा।
एडम जेंट

9
स्टैकट्रेस व्यवसाय के लिए -1। यह धीमा है और संभावित रूप से संकलक अनुकूलन को रोकता है।
फ़ूजी

4
लकड़हारा शुरू करते समय "सुस्ती" की बात क्यों होगी? धीमेपन की भावनाएं ज्यादातर लोग समयपूर्व अनुकूलन कहते हैं (हां, कोड थोड़ा हैकिश दिखता है)।
मिककोम

3
@AndrewMcKinlay किस स्थिति में यह कुछ भी तोड़ता है? यदि लकड़हारा टैग को कक्षा के नाम के समान माना जाता है, तो ऐसा करना बिल्कुल ठीक लगता है। रिफैक्टरिंग टूल इसे स्वचालित रूप से नाम बदलने जा रहे हैं, जबकि अगर यह एक हार्ड-कोडेड स्ट्रिंग था, तो रिफैक्टरिंग टूल या तो इसे छोड़ सकता है या कह सकता है "क्या आप भी इसका नाम बदलना चाहते हैं?"।
पीजूसन

23

SLF4J Apache Commons Logging (ACL) की तुलना में एक बेहतर लॉगिंग मुखौटा है। इसमें अन्य लॉगिंग चौखटे के पुल हैं, जिससे ACL, Log4J या Java Util Logging पर सीधी कॉल की जाती है, SLF4J से होकर गुजरती है, ताकि आप चाहें तो सिर्फ एक लॉग कॉन्फ़िगरेशन फ़ाइल के साथ सभी आउटपुट को एक लॉग फ़ाइल में निर्देशित कर सकते हैं। आपका एप्लिकेशन कई लॉगिंग फ़्रेमवर्क का उपयोग क्यों करेगा? क्योंकि 3-पार्टी लाइब्रेरी आप उपयोग करते हैं, विशेष रूप से पुराने, शायद करते हैं।

SLF4J विभिन्न लॉगिंग कार्यान्वयन का समर्थन करता है। यह सब कुछ मानक-आउट करने के लिए आउटपुट कर सकता है, लॉग 4 जे या लॉगबैक (लॉग 4 जे पर अनुशंसित) का उपयोग कर सकता है।

http://www.slf4j.org/

http://logback.qos.ch/


9

मैं व्यक्तिगत रूप से minlog का उपयोग करूंगा । यह बेहद सरल है, क्योंकि लॉगिंग क्लास कोड की कुछ सौ लाइनें हैं।


3
न्यूनतम पदचिह्न के लिए, यह चुनने के लिए पुस्तकालय है।
h3xStream

0

मेरा सुझाव है कि आप अपाचे के कॉमन्स लॉगिंग उपयोगिता का उपयोग करें। यह अत्यधिक स्केलेबल है और विभिन्न लॉगर्स के लिए अलग लॉग फाइल का समर्थन करता है। यहाँ देखें


11
अच्छा सुझाव! फिर भी जवाब देने की कोशिश करें कि वे क्या पूछते हैं, अन्यथा सिर्फ एक टिप्पणी छोड़ दें;)
19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.