Re: Redirecting System.err to log4j

2005-11-22 Thread Xavier Outhier

Xavier Outhier wrote:

Try the modified code below, it should help to have a better output : 
no blank,

no empty line and should be valid on the 3 systems: linux, win and mac.

Cheers,

Xavier.
[...]


The line below is of course useless. I used it for my own tests.

 static Logger myLogger = 
Logger.getLogger(JscLoggingOutputStream.class.getName());


[...]

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: Redirecting System.err to log4j

2005-11-22 Thread Xavier Outhier
Try the modified code below, it should help to have a better output : no 
blank,

no empty line and should be valid on the 3 systems: linux, win and mac.

Cheers,

Xavier.

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

/**
* An OutputStream that flushes out to a Category.
* 
* Note that no data is written out to the Category until the stream is
* flushed or closed.
* 
* Example:
* // make sure everything sent to System.err is logged
* System.setErr(new PrintStream(new
* JscLoggingOutputStream(Category.getRoot(),
* Priority.WARN), true));
* 
* // make sure everything sent to System.out is also logged
* System.setOut(new PrintStream(new
* JscLoggingOutputStream(Category.getRoot(),
* Priority.INFO), true));
* 
*
* @author mailto://[EMAIL PROTECTED]">Jim Moore
* @see Category
*/

//
public class JscLoggingOutputStream extends OutputStream {
 static Logger myLogger = 
Logger.getLogger(JscLoggingOutputStream.class.getName());


 /**
  * Used to maintain the contract of [EMAIL PROTECTED] #close()}.
  */
 protected boolean hasBeenClosed = false;

 /**
  * The internal buffer where data is stored.
  */
 protected byte[] buf;

 /**
  * The number of valid bytes in the buffer. This value is always
  * in the range 0 through buf.length; elements
  * buf[0] through buf[count-1] contain valid
  * byte data.
  */
 protected int count;

 /**
  * Remembers the size of the buffer for speed.
  */
 private int bufLength;

 /**
  * The default number of bytes in the buffer. =2048
  */
 public static final int DEFAULT_BUFFER_LENGTH = 2048;


 /**
  * The category to write to.
  */
 protected Logger logger;

 /**
  * The priority to use when writing to the Category.
  */
 protected Level level;


 private JscLoggingOutputStream() {
   // illegal
 }


 /**
  * Creates the JscLoggingOutputStream to flush to the given Category.
  *
  * @param log  the Logger to write to
  * @param level the Level to use when writing to the Logger
  * @throws IllegalArgumentException if cat == null or priority ==
  * null
  */
 public JscLoggingOutputStream(Logger log, Level level)
 throws IllegalArgumentException {
   if (log == null) {
 throw new IllegalArgumentException("cat == null");
   }
   if (level == null) {
 throw new IllegalArgumentException("priority == null");
   }
  
   this.level = level;

   logger = log;
   bufLength = DEFAULT_BUFFER_LENGTH;
   buf = new byte[DEFAULT_BUFFER_LENGTH];
   count = 0;
 }


 /**
  * Closes this output stream and releases any system resources
  * associated with this stream. The general contract of
  * close
  * is that it closes the output stream. A closed stream cannot
  * perform
  * output operations and cannot be reopened.
  */
 public void close() {
   flush();
   hasBeenClosed = true;
 }


 /**
  * Writes the specified byte to this output stream. The general
  * contract for write is that one byte is written
  * to the output stream. The byte to be written is the eight
  * low-order bits of the argument b. The 24
  * high-order bits of b are ignored.
  *
  * @param b the byte to write
  * @throws IOException if an I/O error occurs. In particular,
  * an IOException may be thrown if
  * the
  * output stream has been closed.
  */
 public void write(final int b) throws IOException {
   if (hasBeenClosed) {
 throw new IOException("The stream has been closed.");
   }
  
   // would this be writing past the buffer?

   if (count == bufLength) {
 // grow the buffer
 final int newBufLength = bufLength + DEFAULT_BUFFER_LENGTH;
 final byte[] newBuf = new byte[newBufLength];

 System.arraycopy(buf, 0, newBuf, 0, bufLength);

 buf = newBuf;

 bufLength = newBufLength;
   }
  
   buf[count] = (byte) b;

   count++;
 }


 /**
  * Flushes this output stream and forces any buffered output bytes
  * to be written out. The general contract of flush is
  * that calling it is an indication that, if any bytes previously
  * written have been buffered by the implementation of the output
  * stream, such bytes should immediately be written to their
  * intended destination.
  */
 public void flush() {
  
   if (count == 0) {

 return;
   }
  
   // don't print out blank lines; flushing from PrintStream puts

   // out these
  
   // For linux system

   if (count == 1 && ((char) buf[0]) == '\n') {
 reset();
 return;
   }
  
   // For mac system

   if (count == 1 && ((char) buf[0]) == '\r') {
 reset();
 return;
   }
  
  
   // On windows system

   if (count==2 && (char)buf[0]=='\r' && (char)buf[1]=='\n') {
 reset();
 return;
   }
  
   final byte[] theBytes = new byte[count];
  
   System.arraycopy(buf, 0, theBytes, 0, count);
  
   logger.log(level, new String(theBytes));
  
   reset();

 }


 private void reset() {
   // not resetting the buffer -- assuming that if it grew then it
   //   will likely