Skip to content

Instantly share code, notes, and snippets.

@elbosso
Created January 1, 2018 18:47
Show Gist options
  • Save elbosso/5323a90b948e3f458b6cb480a7de0558 to your computer and use it in GitHub Desktop.
Save elbosso/5323a90b948e3f458b6cb480a7de0558 to your computer and use it in GitHub Desktop.
This is a Log4J 1.x appender that takes the log events, formats them according to the specified layout and appends the resulting log messages to a GUI element. I use one of my own components here that builds on https://mvnrepository.com/artifact/net.sf.jped/jedit-syntax/2.2.2 but one can easily replace this code to support any other GUI componen…
package de.netsysit.util;
//This is by no means production-ready code!
/*Copyright (c) 2012-2018.
Juergen Key. Alle Rechte vorbehalten.
Weiterverbreitung und Verwendung in nichtkompilierter oder kompilierter Form,
mit oder ohne Veraenderung, sind unter den folgenden Bedingungen zulaessig:
1. Weiterverbreitete nichtkompilierte Exemplare muessen das obige Copyright,
die Liste der Bedingungen und den folgenden Haftungsausschluss im Quelltext
enthalten.
2. Weiterverbreitete kompilierte Exemplare muessen das obige Copyright,
die Liste der Bedingungen und den folgenden Haftungsausschluss in der
Dokumentation und/oder anderen Materialien, die mit dem Exemplar verbreitet
werden, enthalten.
3. Weder der Name des Autors noch die Namen der Beitragsleistenden
duerfen zum Kennzeichnen oder Bewerben von Produkten, die von dieser Software
abgeleitet wurden, ohne spezielle vorherige schriftliche Genehmigung verwendet
werden.
DIESE SOFTWARE WIRD VOM AUTOR UND DEN BEITRAGSLEISTENDEN OHNE
JEGLICHE SPEZIELLE ODER IMPLIZIERTE GARANTIEN ZUR VERFUEGUNG GESTELLT, DIE
UNTER ANDEREM EINSCHLIESSEN: DIE IMPLIZIERTE GARANTIE DER VERWENDBARKEIT DER
SOFTWARE FUER EINEN BESTIMMTEN ZWECK. AUF KEINEN FALL IST DER AUTOR
ODER DIE BEITRAGSLEISTENDEN FUER IRGENDWELCHE DIREKTEN, INDIREKTEN,
ZUFAELLIGEN, SPEZIELLEN, BEISPIELHAFTEN ODER FOLGENDEN SCHAEDEN (UNTER ANDEREM
VERSCHAFFEN VON ERSATZGUETERN ODER -DIENSTLEISTUNGEN; EINSCHRAENKUNG DER
NUTZUNGSFAEHIGKEIT; VERLUST VON NUTZUNGSFAEHIGKEIT; DATEN; PROFIT ODER
GESCHAEFTSUNTERBRECHUNG), WIE AUCH IMMER VERURSACHT UND UNTER WELCHER
VERPFLICHTUNG AUCH IMMER, OB IN VERTRAG, STRIKTER VERPFLICHTUNG ODER
UNERLAUBTE HANDLUNG (INKLUSIVE FAHRLAESSIGKEIT) VERANTWORTLICH, AUF WELCHEM
WEG SIE AUCH IMMER DURCH DIE BENUTZUNG DIESER SOFTWARE ENTSTANDEN SIND, SOGAR,
WENN SIE AUF DIE MOEGLICHKEIT EINES SOLCHEN SCHADENS HINGEWIESEN WORDEN SIND.
*/
import javax.swing.text.BadLocationException;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;
/**
*
* @author elbosso
*/
public class SyntaxDocumentAppender extends AppenderSkeleton
{
private static org.syntax.jedit.SyntaxStyle[] styles = new org.syntax.jedit.SyntaxStyle[org.syntax.jedit.tokenmarker.Token.ID_COUNT];
static
{
styles[org.syntax.jedit.tokenmarker.Token.NULL] = new org.syntax.jedit.SyntaxStyle(new java.awt.Color(0,0,0),false,false);
styles[org.syntax.jedit.tokenmarker.Token.COMMENT1] = new org.syntax.jedit.SyntaxStyle(new java.awt.Color(204,0,0),true,false);
styles[org.syntax.jedit.tokenmarker.Token.COMMENT2] = new org.syntax.jedit.SyntaxStyle(new java.awt.Color(255,128,0),true,false);
styles[org.syntax.jedit.tokenmarker.Token.COMMENT3] = new org.syntax.jedit.SyntaxStyle(new java.awt.Color(102,0,204),true,false);
styles[org.syntax.jedit.tokenmarker.Token.KEYWORD1] = new org.syntax.jedit.SyntaxStyle(new java.awt.Color(0,102,153),false,true);
styles[org.syntax.jedit.tokenmarker.Token.KEYWORD2] = new org.syntax.jedit.SyntaxStyle(new java.awt.Color(0,153,102),false,true);
styles[org.syntax.jedit.tokenmarker.Token.KEYWORD3] = new org.syntax.jedit.SyntaxStyle(new java.awt.Color(0,153,255),false,true);
styles[org.syntax.jedit.tokenmarker.Token.LITERAL1] = new org.syntax.jedit.SyntaxStyle(new java.awt.Color(255,0,204),false,true);
styles[org.syntax.jedit.tokenmarker.Token.LITERAL2] = new org.syntax.jedit.SyntaxStyle(new java.awt.Color(153,0,204),false,true);
styles[org.syntax.jedit.tokenmarker.Token.LABEL] = new org.syntax.jedit.SyntaxStyle(new java.awt.Color(153,0,51),true,true);
styles[org.syntax.jedit.tokenmarker.Token.OPERATOR] = new org.syntax.jedit.SyntaxStyle(new java.awt.Color(0,0,0),false,true);
styles[org.syntax.jedit.tokenmarker.Token.INVALID] = new org.syntax.jedit.SyntaxStyle(new java.awt.Color(255,0,0),false,false);
};
private org.syntax.jedit.SyntaxDocument doc;
private de.netsysit.ui.text.TextEditor ed;
private boolean beingConstructed;
private boolean appendNextLine;
private boolean scrollLock;
@Override
protected void append(LoggingEvent le)
{
if(beingConstructed==false)
{
ensureConstruction();
javax.swing.SwingUtilities.invokeLater(new LogRunnable(le));
}
}
@Override
public boolean requiresLayout()
{
return true;
}
@Override
public void close()
{
}
public synchronized boolean isAppendNextLine()
{
return appendNextLine;
}
public synchronized void setAppendNextLine(boolean appendNextLine)
{
if(this.appendNextLine!=appendNextLine)
{
javax.swing.SwingUtilities.invokeLater(new java.lang.Runnable()
{
public void run()
{
ensureConstruction();
try
{
ed.clear();
} catch (BadLocationException e)
{
getErrorHandler().error(e.getMessage());
}
}
});
}
this.appendNextLine = appendNextLine;
}
public synchronized boolean isScrollLock()
{
return scrollLock;
}
public synchronized void setScrollLock(boolean scrollLock)
{
this.scrollLock = scrollLock;
}
private void ensureConstruction()
{
if(doc==null)
{
beingConstructed=true;
de.netsysit.ui.text.AugmentedJEditTextArea ta=new de.netsysit.ui.text.AugmentedJEditTextArea();
ed=new de.netsysit.ui.text.TextEditor(ta);
doc=new org.syntax.jedit.SyntaxDocument(styles);
ed.setDocument(doc);
doc.setTokenMarker(new org.syntax.jedit.tokenmarker.Log4jTokenMarker());
ed.setEditable(false);
beingConstructed=false;
}
}
public de.netsysit.ui.text.TextEditor getEditor()
{
ensureConstruction();
return ed;
}
private class LogRunnable extends java.lang.Object implements java.lang.Runnable
{
private final LoggingEvent le;
public LogRunnable(LoggingEvent le)
{
super();
this.le = le;
}
public void run()
{
try
{
if(isAppendNextLine())
{
doc.insertString(ed.getTextField().getDocumentLength(), getLayout().format(le), null);
if(isScrollLock()==false)
ed.getTextField().setCaretPosition(ed.getTextField().getLineStartOffset(ed.getTextField().getCaretLine()));
}
else
{
doc.insertString(0, getLayout().format(le), null);
if(isScrollLock()==false)
ed.getTextField().setCaretPosition(0);
}
} catch (BadLocationException ex)
{
getErrorHandler().error(ex.getMessage());
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment