Custom appender to output log4j logs to the GUI

Source: Internet
Author: User

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

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.