package org.fanhongtao.log; import java.io.StringWriter; import org.apache.log4j.Level; import org.apache.log4j.WriterAppender; import org.apache.log4j.spi.LoggingEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.widgets.Display; /** * This appender write log messages into a StyledText controller.<br> * If the log level is equal to ERROR, or bigger than ERROR, the message is * written in <b>red</b> color. * * @author Fan Hongtao * @created 2010-11-10 */ public class SwtStyledTextAppender extends WriterAppender { private static final Color red = Display.getDefault().getSystemColor(SWT.COLOR_RED); /** The StyledText controller to write log text */ private StyledText styledText = null; private StringWriter sw; public SwtStyledTextAppender(StyledText styledText) { this.styledText = styledText; sw = new StringWriter(1024); setWriter(sw); } @Override public void append(LoggingEvent event) { sw.getBuffer().setLength(0); super.append(event); // write log message into StyledText controller final String message = sw.toString(); final int logLevel = event.getLevel().toInt(); Display.getDefault().syncExec(new Runnable() { @Override public void run() { int start = styledText.getCharCount(); styledText.append(message); if (logLevel >= Level.ERROR_INT) { int stop = styledText.getCharCount(); StyleRange range = new StyleRange(start, stop - start, red, null); styledText.setStyleRange(range); } } }); } }