Created
January 1, 2018 18:47
-
-
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…
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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