Re: log4j configuration and Applets
Richard Maher wrote:
I need to do some logging from my Applet with varying levels of verbosity
and log4j looked like the most likely, best-of-breed, widley used, option
available for the right price. (The Applet is unsigned so a Console Appender
to System.out is all I require and have available)
So I downloaded log4j-1_2_15.jar and included it with my HTML <object> and
everything looked ok, but when the Applet loaded it was now instructing the
browser to look for a log4j.xml or log4j.conf file. I thought I was
good-to-code with the default configuration options (plus runtime
configuration of the logging level [info,debug,fatal, etc]) but I was happy
to stick a minimal XML file where the browser could find it. (See below)
What I don't like about it now is it's asking for all sorts of
infrastructure bloat to be resolved and sent down the line: -
T3$APPLET_ROOT:[000000.APPLETS.META-INF.SERVICES]
JAVAX^.XML^.PARSERS.DOCUMENTBUILDERFACTORY
T3$APPLET_ROOT:[000000.APPLETS.ORG.APACHE.LOG4J]
CONSOLEAPPENDERBEANINFO.CLASS
WRITERAPPENDERBEANINFO.CLASS
APPENDERSKELETONBEANINFO.CLASS
PATTERNLAYOUTBEANINFO.CLASS
LAYOUTBEANINFO.CLASS
T3$APPLET_ROOT:[000000.APPLETS.JAVA.LANG]
OBJECTBEANINFO.CLASS
I guess I'm asking why these classes (if needed) aren't in the JAR file
already and just home much "baggage" does log4j need?
Is there a "minimalist" switch I can set in the config, or perhaps log4j is
not the most appropriate tool after all?
I have no idea about where those classes come from. But I do
not think they are needed.
See simple example below, which works for me.
I use log4j.properties instead of log4j.xml, but that should
not matter.
Arne
========================================================
Jar content
-----------
0 Sun Jun 07 15:48:38 EDT 2009 META-INF/
97 Sun Jun 07 15:48:38 EDT 2009 META-INF/MANIFEST.MF
799 Sun Jun 07 15:33:08 EDT 2009 test/LogApplet$1.class
798 Sun Jun 07 15:33:08 EDT 2009 test/LogApplet$2.class
798 Sun Jun 07 15:33:08 EDT 2009 test/LogApplet$3.class
799 Sun Jun 07 15:33:08 EDT 2009 test/LogApplet$4.class
1302 Sun Jun 07 15:33:08 EDT 2009 test/LogApplet$5.class
1291 Sun Jun 07 15:33:08 EDT 2009 test/LogApplet$6.class
2216 Sun Jun 07 15:33:08 EDT 2009 test/LogApplet.class
2947 Sun Jun 07 15:48:34 EDT 2009 test/GuiAppender.class
487 Sun Jun 07 15:31:40 EDT 2009 log4j.properties
Manifest
--------
Class-Path: log4j-1.2.9.jar
LogApplet.java
--------------
package test;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JApplet;
import javax.swing.JButton;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class LogApplet extends JApplet {
private Logger log = Logger.getLogger(LogApplet.class);
private JButton debugbtn = new JButton("Log debug");
private JButton infobtn = new JButton("Log info");
private JButton warnbtn = new JButton("Log warning");
private JButton errorbtn = new JButton("Log error");
private JButton consolebtn = new JButton("Log to console");
private JButton guibtn = new JButton("Log to GUI");
private boolean console = false;
private boolean gui = false;
public void init() {
debugbtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
log.debug("This is a test");
}
});
infobtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
log.info("This is a test");
}
});
warnbtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
log.warn("This is a test");
}
});
errorbtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
log.error("This is a test");
}
});
consolebtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
console = !console;
ConsoleAppender app =
(ConsoleAppender)log.getAppender("console");
if(console) {
app.setThreshold(Level.DEBUG);
} else {
app.setThreshold(Level.OFF);
}
}
});
guibtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
gui = !gui;
GuiAppender app = (GuiAppender)log.getAppender("gui");
if(gui) {
app.setThreshold(Level.DEBUG);
app.open();
} else {
app.setThreshold(Level.OFF);
}
}
});
getContentPane().setLayout(new GridLayout(3,2 ));
getContentPane().add(debugbtn);
getContentPane().add(infobtn);
getContentPane().add(warnbtn);
getContentPane().add(errorbtn);
getContentPane().add(consolebtn);
getContentPane().add(guibtn);
}
}
GuiAppender.java
----------------
package test;
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.spi.LoggingEvent;
public class GuiAppender extends AppenderSkeleton {
private JFrame f;
private JTextPane tp;
public GuiAppender() {
f = new JFrame();
f.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
//f.setAlwaysOnTop(true);
tp = new JTextPane();
f.getContentPane().setLayout(new BorderLayout());
f.getContentPane().add(tp, BorderLayout.CENTER);
f.setSize(600, 400);
}
private Color LevelToColor(Level lvl) {
if(lvl.equals(Level.DEBUG)) {
return Color.GRAY;
} else if(lvl.equals(Level.INFO)) {
return Color.GREEN;
} else if(lvl.equals(Level.WARN)) {
return Color.YELLOW;
} else if(lvl.equals(Level.ERROR)) {
return Color.RED;
} else if(lvl.equals(Level.FATAL)) {
return Color.RED;
} else {
return Color.BLACK;
}
}
protected void append(LoggingEvent ev) {
try {
StyledDocument doc = tp.getStyledDocument();
MutableAttributeSet attrs = tp.getInputAttributes();
StyleConstants.setForeground(attrs,
LevelToColor(ev.getLevel()));
StyleConstants.setBackground(attrs, Color.LIGHT_GRAY);
doc.insertString(doc.getLength(), getLayout().format(ev),
attrs);
} catch (BadLocationException e) {
e.printStackTrace();
}
}
public void open() {
f.setVisible(true);
}
public void close() {
f.dispose();
}
public boolean requiresLayout() {
return true;
}
}
log4j.properties
----------------
log4j.category.test.LogApplet = debug, console, gui
log4j.appender.console.threshold = off
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %-30c %d %-5p %m%n
log4j.appender.gui.threshold = off
log4j.appender.gui = test.GuiAppender
log4j.appender.gui.layout = org.apache.log4j.PatternLayout
log4j.appender.gui.layout.ConversionPattern = %-30c %d %-5p %m%n