001 package org.shiftone.jrat.util.log.target;
002
003
004 import org.shiftone.jrat.util.io.PrintStreamWriter;
005 import org.shiftone.jrat.util.log.Logger;
006
007 import java.io.PrintStream;
008 import java.io.PrintWriter;
009 import java.io.StringWriter;
010 import java.io.Writer;
011 import java.text.DateFormat;
012 import java.text.SimpleDateFormat;
013 import java.util.Date;
014
015
016 /**
017 * @author jeff@shiftone.org (Jeff Drost)
018 */
019 public class WriterLogTarget implements LogTarget {
020
021 private static final Logger LOG = Logger.getLogger(WriterLogTarget.class);
022 public static final LogTarget SYSTEM_OUT = new WriterLogTarget(System.out);
023 public static final LogTarget SYSTEM_ERROR = new WriterLogTarget(System.err);
024 private static final String DATE_FORMAT = "MMM/dd HH:mm:ss,SSS";
025 private final Writer writer;
026 private final DateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
027
028 public WriterLogTarget(PrintStream printStream) {
029 this(new PrintStreamWriter(printStream));
030 }
031
032
033 public WriterLogTarget(Writer writer) {
034 this.writer = writer;
035 }
036
037
038 public boolean isLevelEnabled(String topic, int level) {
039 return true;
040 }
041
042
043 public void log(String topic, int level, Object message, Throwable throwable) {
044
045 StringBuffer buffer = new StringBuffer(80);
046
047 buffer.append("JRat:");
048 buffer.append(Logger.LEVEL_NAMES[level]);
049 buffer.append(" (");
050 buffer.append(formatDate(new Date()));
051 buffer.append(") (");
052 buffer.append(Thread.currentThread().getName());
053 buffer.append(") ");
054 buffer.append(topic);
055 buffer.append(" - ");
056 buffer.append(String.valueOf(message));
057
058 if (throwable != null) {
059 buffer.append("\n");
060 buffer.append(throwableToString(throwable));
061 }
062
063 buffer.append('\n');
064
065 synchronized (this) {
066 try {
067 writer.write(buffer.toString());
068 writer.flush();
069 }
070 catch (Exception e) {
071 System.err.print("logging failed!");
072 e.printStackTrace(System.err);
073 }
074 }
075 }
076
077
078 private static String throwableToString(Throwable throwable) {
079
080 StringWriter stringWriter = new StringWriter();
081 PrintWriter printWriter = new PrintWriter(stringWriter);
082
083 printWriter.print('\t');
084 printWriter.println(throwable.getMessage());
085 throwable.printStackTrace(printWriter);
086 printWriter.flush();
087
088 return stringWriter.toString();
089 }
090
091
092 private synchronized String formatDate(Date date) {
093 return dateFormat.format(new Date());
094 }
095 }