001: /* ====================================================================
002: * The Apache Software License, Version 1.1
003: *
004: * Copyright (c) 1997-2003 The Apache Software Foundation. All rights
005: * reserved.
006: *
007: * Redistribution and use in source and binary forms, with or without
008: * modification, are permitted provided that the following conditions
009: * are met:
010: *
011: * 1. Redistributions of source code must retain the above copyright
012: * notice, this list of conditions and the following disclaimer.
013: *
014: * 2. Redistributions in binary form must reproduce the above copyright
015: * notice, this list of conditions and the following disclaimer in
016: * the documentation and/or other materials provided with the
017: * distribution.
018: *
019: * 3. The end-user documentation included with the redistribution,
020: * if any, must include the following acknowledgment:
021: * "This product includes software developed by the
022: * Apache Software Foundation (http://www.apache.org/)."
023: * Alternately, this acknowledgment may appear in the software
024: * itself, if and wherever such third-party acknowledgments
025: * normally appear.
026: *
027: * 4. The names "Jakarta", "Avalon", and "Apache Software Foundation"
028: * must not be used to endorse or promote products derived from this
029: * software without prior written permission. For written
030: * permission, please contact apache@apache.org.
031: *
032: * 5. Products derived from this software may not be called "Apache",
033: * nor may "Apache" appear in their name, without prior written
034: * permission of the Apache Software Foundation.
035: *
036: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
037: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
038: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
039: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
040: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: * SUCH DAMAGE.
048: * ====================================================================
049: *
050: * This software consists of voluntary contributions made by many
051: * individuals on behalf of the Apache Software Foundation. For more
052: * information on the Apache Software Foundation, please see
053: * <http://www.apache.org/>.
054: */
055: package org.apache.log.util;
056:
057: import java.io.EOFException;
058: import java.io.IOException;
059: import java.io.OutputStream;
060: import org.apache.log.Logger;
061: import org.apache.log.Priority;
062:
063: /**
064: * Redirect an output stream to a logger.
065: * This class is useful to redirect standard output or
066: * standard error to a Logger. An example use is
067: *
068: * <pre>
069: * final LoggerOutputStream outputStream =
070: * new LoggerOutputStream( logger, Priority.DEBUG );
071: * final PrintStream output = new PrintStream( outputStream, true );
072: *
073: * System.setOut( output );
074: * </pre>
075: *
076: * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
077: * @author <a href="mailto:peter@apache.org">Peter Donald</a>
078: */
079: public class LoggerOutputStream extends OutputStream {
080: ///Logger that we log to
081: private final Logger m_logger;
082:
083: ///Log level we log to
084: private final Priority m_priority;
085:
086: ///The buffered output so far
087: private final StringBuffer m_output = new StringBuffer();
088:
089: ///Flag set to true once stream closed
090: private boolean m_closed;
091:
092: /**
093: * Construct OutputStreamLogger to write to a particular logger at a particular priority.
094: *
095: * @param logger the logger to write to
096: * @param priority the priority at which to log
097: */
098: public LoggerOutputStream(final Logger logger,
099: final Priority priority) {
100: m_logger = logger;
101: m_priority = priority;
102: }
103:
104: /**
105: * Shutdown stream.
106: * @exception IOException if an error occurs while closing the stream
107: */
108: public void close() throws IOException {
109: flush();
110: super .close();
111: m_closed = true;
112: }
113:
114: /**
115: * Write a single byte of data to output stream.
116: *
117: * @param data the byte of data
118: * @exception IOException if an error occurs
119: */
120: public void write(final int data) throws IOException {
121: checkValid();
122:
123: //Should we properly convert char using locales etc??
124: m_output.append((char) data);
125:
126: if ('\n' == data) {
127: flush();
128: }
129: }
130:
131: /**
132: * Flush data to underlying logger.
133: *
134: * @exception IOException if an error occurs
135: */
136: public synchronized void flush() throws IOException {
137: checkValid();
138:
139: m_logger.log(m_priority, m_output.toString());
140: m_output.setLength(0);
141: }
142:
143: /**
144: * Make sure stream is valid.
145: *
146: * @exception IOException if an error occurs
147: */
148: private void checkValid() throws IOException {
149: if (true == m_closed) {
150: throw new EOFException("OutputStreamLogger closed");
151: }
152: }
153: }
|