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 }