मैं माइकल एस से विचार उठाया है, लेकिन जैसे एक टिप्पणी में उल्लेख किया है, यह कुछ समस्याओं का है: यह सब कुछ पर कब्जा नहीं है, और यह कुछ खाली लाइनों प्रिंट करता है।
इसके अलावा, मैं System.out
और System.err
अलग करने के लिए है, ताकि System.out
लॉग स्तर 'INFO'
साथ लॉग होता है और System.err
'ERROR'
साथ लॉग होता है (या 'WARN'
यदि आप चाहें) चाहता था। सबसे पहले एक वर्ग है कि OutputStream
फैली (यह PrintStream
के लिए की तुलना में OutputStream
के लिए सभी तरीकों ओवरराइड करने के लिए आसान है):
तो यह मेरा समाधान है। यह एक निर्दिष्ट लॉग स्तर के साथ लॉग करता है और यह सब कुछ OutputStream
पर प्रतिलिपि बनाता है। और यह भी "खाली" तारों का पता लगाता है (केवल व्हाइटस्पेस युक्त) और उन्हें लॉग इन नहीं करता है।
import java.io.IOException;
import java.io.OutputStream;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class LoggerStream extends OutputStream
{
private final Logger logger;
private final Level logLevel;
private final OutputStream outputStream;
public LoggerStream(Logger logger, Level logLevel, OutputStream outputStream)
{
super();
this.logger = logger;
this.logLevel = logLevel;
this.outputStream = outputStream;
}
@Override
public void write(byte[] b) throws IOException
{
outputStream.write(b);
String string = new String(b);
if (!string.trim().isEmpty())
logger.log(logLevel, string);
}
@Override
public void write(byte[] b, int off, int len) throws IOException
{
outputStream.write(b, off, len);
String string = new String(b, off, len);
if (!string.trim().isEmpty())
logger.log(logLevel, string);
}
@Override
public void write(int b) throws IOException
{
outputStream.write(b);
String string = String.valueOf((char) b);
if (!string.trim().isEmpty())
logger.log(logLevel, string);
}
}
और फिर एक बहुत ही सरल उपयोगिता वर्ग out
और err
स्थापित करने के लिए:
import java.io.PrintStream;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class OutErrLogger
{
public static void setOutAndErrToLog()
{
setOutToLog();
setErrToLog();
}
public static void setOutToLog()
{
System.setOut(new PrintStream(new LoggerStream(Logger.getLogger("out"), Level.INFO, System.out)));
}
public static void setErrToLog()
{
System.setErr(new PrintStream(new LoggerStream(Logger.getLogger("err"), Level.ERROR, System.err)));
}
}
स्रोत
2011-09-20 01:20:24
यह अपवादों के साथ काम करता है, लेकिन यह stdout पर लिखे गए सभी आउटपुट को कैप्चर नहीं करता है। उदाहरण के लिए यदि आपने System.out.print (5) कहा है; यह प्रॉक्सी प्रिंट स्ट्रीम को बाईपास करेगा। साथ ही, अपवादों के साथ भी अगर आप कुछ अपवाद करते हैं तो यह अतिरिक्त रिक्त रेखाओं को मुद्रित कर देगा .printStackTrace() – sbridges
हाय .. जहां लॉग फ़ाइल उत्पन्न होगी? धन्यवाद –
@ एसब्रिजेस यदि आपको आवश्यकता हो तो आप अधिक तरीकों को ओवरराइड कर सकते हैं। उदाहरण के लिए 'printStackTrace'' println (ऑब्जेक्ट ओ) 'विधि को कॉल करता है जिसे आप उन खराब रिक्त रेखाओं को खत्म करने के लिए ओवरराइड भी कर सकते हैं। – tysonjh