यदि कोई समस्या है तो इस समस्या का हल ढूंढ रहे हैं। यहां मैं आखिरकार आया था: मैंने बस स्ट्रीमहैंडलर को उपclassed और अतिरिक्त पैरामीटर मैक्सलेवल जोड़ा, जिसे प्रकाशित() की शुरुआत में चेक किया गया है। यदि लॉगिंग ईवेंट का स्तर मैक्सलेवल से बड़ा है, तो प्रकाशित नहीं किया जाएगा।
MaxlevelStreamHandler.java मुख्य नीचे वर्ग: यहाँ विवरण हैं।
package helper;
/**
* The only difference to the standard StreamHandler is
* that a MAXLEVEL can be defined (which then is not published)
*
* @author Kai Goergen
*/
import java.io.PrintStream;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.StreamHandler;
public class MaxlevelStreamHandler extends StreamHandler {
private Level maxlevel = Level.SEVERE; // by default, put out everything
/**
* The only method we really change to check whether the message
* is smaller than maxlevel.
* We also flush here to make sure that the message is shown immediately.
*/
@Override
public synchronized void publish(LogRecord record) {
if (record.getLevel().intValue() > this.maxlevel.intValue()) {
// do nothing if the level is above maxlevel
} else {
// if we arrived here, do what we always do
super.publish(record);
super.flush();
}
}
/**
* getter for maxlevel
* @return
*/
public Level getMaxlevel() {
return maxlevel;
}
/**
* Setter for maxlevel.
* If a logging event is larger than this level, it won't be displayed
* @param maxlevel
*/
public void setMaxlevel(Level maxlevel) {
this.maxlevel = maxlevel;
}
/** Constructor forwarding */
public MaxlevelStreamHandler(PrintStream out, Formatter formatter) {
super(out, formatter);
}
/** Constructor forwarding */
public MaxlevelStreamHandler() {
super();
}
}
मुख्य क्लास
अब stdout में कुछ घटनाओं और दिखाने के लिए stderr में कुछ, बस सेटअप दो StreamLoggers, महत्वपूर्ण घटनाओं के लिए एक और अन्य सभी के लिए एक है, और मानक सांत्वना लकड़हारा निष्क्रिय कर दें:
// setup all logs that are smaller than WARNINGS to stdout
MaxlevelStreamHandler outSh = new MaxlevelStreamHandler(System.out, formatter);
outSh.setLevel(Level.ALL);
outSh.setMaxlevel(Level.INFO);
logger.addHandler(outSh);
// setup all warnings to stdout & warnings and higher to stderr
StreamHandler errSh = new StreamHandler(System.err, formatter);
errSh.setLevel(Level.WARNING);
logger.addHandler(errSh);
// remove default console logger
logger.setUseParentHandlers(false);
logger.info("info");
logger.warning("warning");
logger.severe("severe");
आशा है कि इससे मदद मिलती है!
अपडेट: मैंने सुपर.publish() के बाद super.flush() को सही ढंग से जोड़ा है ताकि यह सुनिश्चित किया जा सके कि संदेश तुरंत दिखाया गया है। इससे पहले, मुझे समस्याएं थीं कि लॉग-मैसेज हमेशा अंत में दिखाए जाते थे। यह अब उपरोक्त कोड का हिस्सा है।
मुझे लगता है कि कंसोलहैंडलर डिफ़ॉल्ट है, स्ट्रीमहैंडलर है जो किसी भी अन्य स्ट्रीम पर प्रिंट कर सकता है। – Uri
हां, लेकिन आप StreamHandler को उपclass करना चाहते हैं ताकि System.err को बंद करने का प्रयास करने से बचने के लिए, मुझे संदेह है। –