blob: 7fbdaeaed2293bf6b4cfb42c5fc18a54f22a2d32 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one or more contributor
// license agreements. See the NOTICE.txt file distributed with this work for
// additional information regarding copyright ownership. The ASF licenses this
// file to you under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
package org.apache.oodt.commons.io;
import java.io.Writer;
import java.io.IOException;
import org.apache.oodt.commons.util.*;
/** Log messages to a <code>Writer</code>.
*
* This class defines a {@link LogListener} that logs its messages to a character stream
* {@link Writer}. This formats and writes to the output stream all log events passed to
* {@link LogListener#messageLogged}, one per line. Each line is separated with the
* system's line separator characters, specified by the <code>line.separator</code> system
* property.
*
* <p>It ignores all events passed to {@link LogListener#streamStarted} and
* {@link LogListener#streamStopped}.
*
* <p>It quietly hides all IO errors that may occur during writing.
*
* @see Log
* @author Kelly
*/
public class WriterLogger implements LogListener {
/** Constructor given an output stream.
*
* Construct a writer logger that writes message events to the given output stream
* and flushes the stream after every logged message.
*
* @param outputStream The output stream to which to write events.
*/
public WriterLogger(java.io.OutputStream outputStream) {
this(new java.io.BufferedWriter(new java.io.OutputStreamWriter(outputStream)), /*autoFlush*/ true);
}
/** Constructor given a writer.
*
* Construct a writer logger that writes message events to the given writer and
* flushes the stream after every logged message.
*
* @param writer The writer to which to write events.
*/
public WriterLogger(Writer writer) {
this(writer, /*autoFlush*/ true);
}
/** General constructor.
*
* Construct a writer logger that writes message events to the given writer and
* optionally flushes the stream after every logged message.
*
* @param writer The writer to which to write events.
* @param autoFlush If true, call flush on the writer after every message
* logged. If false, don't call flush.
*/
public WriterLogger(Writer writer, boolean autoFlush) {
if (writer == null)
throw new IllegalArgumentException("Can't write to a null writer");
this.writer = writer;
this.autoFlush = autoFlush;
this.lineSep = System.getProperty("line.separator", "\n");
}
/** Close the writer.
*
* This closes the writer to which this logger was logging. Future message events
* are ignored and not written.
*/
public final void close() {
if (writer == null) return;
try {
writer.close();
} catch (IOException ignore) {}
writer = null;
}
/** Log a message to the writer.
*
* This method first calls {@link #formatMessage} to format the message, and then
* writes the message to the output stream.
*
* @param event The event describing the message that was logged.
*/
public final void messageLogged(LogEvent event) {
if (writer == null) return;
try {
writer.write(formatMessage(event.getTimestamp(), (String) event.getSource(), event.getCategory(),
event.getMessage()) + lineSep);
if (autoFlush) writer.flush();
} catch (IOException ignore) {}
}
/** Format a message for logging.
*
* This method formats a message as follows:
*
* <p><code><var>epochTime</var> (<var>time</var>) <var>source</var> <var>category</var>:
* <var>message</var>
*
* <p>where <var>epochTime</var> is the time in milliseconds since midnight, 1st
* January 1970 GMT, <var>time</var> is human-readable time, <var>source</var> is
* the source of the message, <var>category</var> is the category under which the
* message was logged, and <var>message</var> is the message.
*
* <p>You can override this method and provide your own formatting.
*
* @param timestamp Timestamp for the message.
* @param source Source of the message.
* @param category Category of the message.
* @param message The message text.
*/
protected String formatMessage(java.util.Date timestamp, String source, Object category, String message) {
return ("\n" + DateConvert.isoFormat(timestamp) + " " + source + " " + category + ": " + message);
}
/** Ignore the stream started event.
*
* @param event The event to ignore.
*/
public void streamStarted(LogEvent event) {
return;
}
/** Ignore the stream stopped event.
*
* @param event The event to ignore.
*/
public void streamStopped(LogEvent event) {
return;
}
public void propertyChange(java.beans.PropertyChangeEvent ignore) {}
/** The writer to which we write log messages.
*
* If null, then we were closed. This is protected so you can extend this class
* and log other events normally ignored.
*/
protected Writer writer;
/** If true, flush after every message logged.
*
* This is protected so you can extend this class and log other events normally ignored.
*/
protected boolean autoFlush;
/** What the line separator is.
*
* This is protected so you can extend this class and log other events normally ignored.
*/
protected String lineSep;
}