Componentappender. Java
Package log4gui. log4j;
Import java. AWT .*;
Import java. util. hashtable;
Import javax. Swing .*;
Import javax. Swing. Text .*;
Import org. Apache. log4j .*;
Import org. Apache. log4j. SPI. loggingevent;
/**
* Extend appenderskeleton to implement the append method.
*/
Public class componentappender extends appenderskeleton {
Protected component comp; // GUI component used to display log information
Protected int entries;
Protected int maxentries; // maximum number of records displayed
Public static appender getappender (string appendername ){
Return getappender (appendername, null );
}
Public static appender getappender (string appendername, string categoryname ){
Appender result = NULL;
Logger testcat;
If (categoryname! = NULL ){
Testcat = logger. getlogger (categoryname );
If (testcat! = NULL ){
Result = testcat. getappender (appendername );
}
}
If (result = NULL ){
Testcat = logger. getrootlogger ();
Result = testcat. getappender (appendername );
}
Return result;
}
Public componentappender (){
This (null );
}
Public componentappender (Component comp ){
This (COMP, 1 );
}
Public componentappender (Component comp, int maxentries ){
Mutableattributeset attset;
This. Entries = 0;
This. maxentries = maxentries;
Setcomponent (COMP );
}
Public component getcomponent (){
Return this. Comp;
}
Public void setcomponent (Component comp ){
If (Comp instanceof jtextarea) | (Comp instanceof jtextpane ))
This. layout = new patternlayout ("% N % m ");
Else
This. layout = new patternlayout ("% m ");
This. Comp = comp;
}
Public int getmaxentries (){
Return this. maxentries;
}
/**
* Sets the maximum number of logging entries.
*
* @ Param value-Maximum number of logging entries. This value is ignored if the component
* Supports just 1 line.
*/
Public void setmaxentries (INT value ){
If (this. Entries> value ){
// The New maxentry value is smaller than the actual entry counter
// We have to delete the oldest entries
Int toomuch = This. Entries-value;
If (Comp instanceof jtextpane ){
Jtextpane textpane = (jtextpane) comp;
Try {
Styleddocument Doc = textpane. getstyleddocument ();
If (entries = maxentries ){
Element element = Doc. getparagraphelement (0 );
Int startofs = element. getstartoffset ();
Element = Doc. getparagraphelement (toomuch-1 );
Int endofs = element. getendoffset ();
Doc. Remove (startofs, endofs-startofs );
}
} Catch (exception X ){
X. printstacktrace ();
}
}
Else if (Comp instanceof jtextarea ){
Jtextarea textarea = (jtextarea) comp;
Try {
Document Doc = textarea. getdocument ();
Int endofs = textarea. getlineendoffset (toomuch-1 );
Int doclen = Doc. getlength ();
String doctext = textarea. gettext ();
If (doclen <endofs)
Doc. Remove (0, doclen );
Else
Doc. Remove (0, endofs );
Textarea. setcaretposition (Doc. getlength ());
} Catch (exception X ){
}
}
Else if (Comp instanceof jcombobox ){
Defaultcomboboxmodel model = (defaultcomboboxmodel) (jcombobox) comp). GetModel ();
For (INT I = 0; I <toomuch; I ++ ){
Model. removeelementat (0 );
}
}
Else if (Comp instanceof java. AWT. List ){
For (INT I = 0; I <toomuch; I ++ ){
(Java. AWT. List) comp). Remove (0 );
}
}
This. Entries = value;
}
This. maxentries = value;
}
Public Boolean requireslayout (){
Return true;
}
Public void append (loggingevent event ){
String text = This. layout. Format (event );
// Swing Components
If (Comp instanceof jlabel ){
(Jlabel) comp). settext (text );
}
Else if (Comp instanceof jtextarea ){
Jtextarea textarea = (jtextarea) comp;
Try {
Document Doc = textarea. getdocument ();
If (entries = maxentries ){
// Delete 1 line
Int endofs = textarea. getlineendoffset (0 );
Int doclen = Doc. getlength ();
String doctext = textarea. gettext ();
If (doclen <endofs)
Doc. Remove (0, doclen );
Else
Doc. Remove (0, endofs );
Entries-= 1;
}
Textarea. append (text );
If (entries = 0)
Doc. Remove (1, 1 );
Textarea. setcaretposition (Doc. getlength ());
} Catch (exception X ){
};
Entries + = 1;
}
Else if (Comp instanceof jtextcomponent ){
(Jtextcomponent) comp). settext (text );
}
Else if (Comp instanceof jcombobox ){
Defaultcomboboxmodel model = (defaultcomboboxmodel) (jcombobox) comp). GetModel ();
If (entries = maxentries ){
Model. removeelementat (0 );
Entries-= 1;
}
Model. addelement (text );
Entries + = 1;
(Jcombobox) comp). setselectedindex (entries-1 );
}
// AWT components
Else if (Comp instanceof java. AWT. Label ){
(Java. AWT. Label) comp). settext (text );
}
Else if (Comp instanceof java. AWT. List ){
If (entries = maxentries ){
(Java. AWT. List) comp). Remove (0 );
Entries-= 1;
}
(Java. AWT. List) comp). Add (text );
Entries + = 1;
}
Else if (Comp instanceof textcomponent ){
(Textcomponent) comp). settext (text );
}
}
/**
* Removes all logging entries from the UI elements
*
*/
Public void reset (){
// Swing Components
If (Comp instanceof jlabel ){
(Jlabel) comp). settext ("");
}
Else if (Comp instanceof jtextcomponent) {// des jtextarea and jtextpane!
(Jtextcomponent) comp). settext ("");
}
Else if (Comp instanceof jcombobox ){
Defaultcomboboxmodel model = (defaultcomboboxmodel) (jcombobox) comp). GetModel ();
Model. removeallelements ();
}
// AWT components
Else if (Comp instanceof java. AWT. Label ){
(Java. AWT. Label) comp). settext ("");
}
Else if (Comp instanceof java. AWT. List ){
(Java. AWT. List) comp). removeall ();
}
Else if (Comp instanceof java. AWT. textcomponent ){
(Java. AWT. textcomponent) comp). settext ("");
}
This. Entries = 0;
}
Public void close (){
Reset ();
}
}
Log4j. Properties
Log4j. rootlogger = debug, stdout, statusline
Log4j. log4gui. example. testlog4j = debug, stdout, statusline
#, Logfile, EventLog
# Configure appender stdout
Log4j. appender. stdout = org. Apache. log4j. leleappender
Log4j. appender. stdout. layout = org. Apache. log4j. patternlayout
Log4j. appender. stdout. layout. conversionpattern = % d {dd. mm. yyyy hh: mm: SS} %-5 p %-20C-% m % N
# Configure appender statusline
Log4j. appender. statusline = log4gui. log4j. componentappender
Log4j. appender. statusline. layout = org. Apache. log4j. patternlayout
Log4j. appender. statusline. layout. conversionpattern = % d {dd. mm. yyyy hh: mm: SS} %-5 p %-20C-% m
Log4j. appender. statusline. Threshold = info