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    }