2013-04-08 6 views
8

मैं वर्तमान में एक प्रोग्राम पर काम कर रहा हूं जिसमें मुझे लॉग आउट फ़ाइल में सभी आउटपुट लिखना होगा।एकाधिक पैरामीटर के साथ लॉगिंग

मुझे एक लॉग विधि लिखनी है, जो एक स्तर, संदेश, ऑब्जेक्ट वैल्यू, एक अन्य संदेश, एक पूर्णांक मान, एक अन्य संदेश और एक अन्य पूर्णांक मान के साथ आउटपुट देना चाहिए, जैसा कि मैंने निर्दिष्ट किया है । मुझे एक लॉग विधि नहीं मिल रही है जो यह करता है। मैं Java.util.logging का उपयोग कर रहा हूँ। क्या यह संभव है?

+0

पर विचार करें Log4J http://logging.apache.org/log4j/2.x/ – Mirco

+1

@ वर्बोज़-मोड क्यों? जावा उपयोग लॉगिंग जो आवश्यक है और करता है और उपयोग करने में आसान है। जहां तक ​​मैं इसे देखता हूं आपका सुझाव KISS को तोड़ता है (इसे सरल एस रखें ...) सिद्धांत। – Martin

उत्तर

13

मैं, आप नीचे दिए गए प्रारूप ठीक है, Message1, object.GetValue(), Message2,1 में लॉग प्रारूप की जरूरत मान Message3,2

आप एक निर्गम संदेश स्वरूप बनाने की जरूरत

logger.log(Level.INFO, "{0},{1},{2},{3},{4},{5}",new Object[]{Message1,object.getValue(),Message2,1,Message3,2}); 

अब आप जो फ़ॉर्मेटर वर्ग का विस्तार

public class DataFormatter extends Formatter { 

@Override 
public synchronized String format(LogRecord record) { 
    String formattedMessage = formatMessage(record); 
    String throwable = ""; 
    String outputFormat = "%1$s, %2$s \n %3$s"; //Also adding for logging exceptions 
    if (record.getThrown() != null) { 
     StringWriter sw = new StringWriter(); 
     PrintWriter pw = new PrintWriter(sw); 
     pw.println(); 
     record.getThrown().printStackTrace(pw); 
     pw.close(); 
     throwable = sw.toString(); 
    } 
    return String.format(outputFormat,record.getLevel().getName(),formattedMessage,throwable); 
} 
} 

अब नव निर्मित फ़ॉर्मेटर

सेट से एक कस्टम फ़ॉर्मेटर बनाने की जरूरत
for(int i=0;i<logger.getHandlers().length;i++) 
     logger.getHandlers()[i].setFormatter(new DataFormatter()); 
9

यह एक पुराना विषय है, किसी भी तरह, मेरे दो सेंट, क्योंकि मैं भी अपनी परियोजनाओं में java.util.logging.Logger` का उपयोग करना पसंद करता हूं।

लैम्बडास इस बॉयलरप्लेट को कई कस्टम पैरामीटर के लिए फॉर्मेट एक्सटेंशन को कम या कम अप्रचलित बनाते हैं, जब तक कि आप अपने एप्लिकेशन-व्यापी पुन: उपयोग से लाभ न लें। (मेरे) सरल परिदृश्य में, लॉग संदेश कोड भाग के अनुरूप होते हैं जहां इसे डाला जाता है, इसलिए String.format() आमतौर पर अधिक आसान और अधिक लचीला होता है।

जावा 8 और लैम्बडास से पहले, Formatter संदेश निर्माण स्थगित करने की एकमात्र संभावना थी। केवल वैकल्पिक स्तर पर आधारित loggable चेक से पहले लॉग इन करने के लिए संदेश बनाने के लिए था।
जावा 8 लैम्बडास के साथ, स्ट्रिंग स्वरूपण को loggable चेक के बाद स्थगित किया जा सकता है, लेकिन फिर भी मूल विधि संदर्भ तक पहुंच के साथ। लैम्ब्डा प्रतिबंधों के कारण, केवल एक छोटा सा नकारात्मक पक्ष है कि सभी एक्सेस किए गए क्षेत्रों को अंतिम होने की आवश्यकता है।

यहाँ एक काफी सरल टुकड़ा:

final String val1 = "lambda expression log message"; 
final Level level = Level.INFO; 
Logger.getGlobal().log(level,() -> 
     String.format("Hello, I'm a %s, evaluated after %s loggable check.", val1, level) 
); 
Logger.getGlobal().log(level, new RuntimeException(),() -> 
     String.format("Hello, I'm a %s with a stack trace, evaluated after %s loggable check.", val1, level) 
); 

आशा इस आप में से कुछ जो भी चाहते निर्मित प्रवेश :-)

चीयर्स बेन का उपयोग करने में मदद करता है

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