blob: fd5e542b6e28d9120bd70cd2af1626d7622a570b [file] [log] [blame]
/*
* Copyright 1999,2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.log4j.chainsaw;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.apache.log4j.Appender;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.helpers.Constants;
import org.apache.log4j.helpers.OptionConverter;
import org.apache.log4j.spi.LoggingEvent;
/**
* ChainsawAppender receives LoggingEvents from the local
* Log4J environment, and appends them into a model that
* can be used inside a Swing GUI
* @author Paul Smith
* @version 1.0
*/
public class ChainsawAppender
extends AppenderSkeleton{
private Appender appender;
/**
* The in-JVM singleton instance of the ChainsawAppender.
*
* If somehow Log4j initialises more than one, then the first one to
* initialise wins!
*/
private static ChainsawAppender sSharedAppender = null;
/**
* The classname of the viewer to create to view the events.
*/
private String viewerClassname;
private String hostname = "localhost";
private String application = "app";
/**
* Constructor, initialises the singleton instance of the appender
*/
public ChainsawAppender() {
super(false);
synchronized (ChainsawAppender.class) {
if (sSharedAppender == null) {
sSharedAppender = this;
}
}
}
/**
* Return the singleton instance of the ChainsawAppender, it should only
* be initialised once.
* @return the One and only instance of the ChainsawAppender that is
* allowed to be referenced by the GUI
*/
static ChainsawAppender getInstance() {
return sSharedAppender;
}
/**
* This appender does not require layout and so return false
* @return false and only false
*/
public boolean requiresLayout() {
return false;
}
public Appender getAppender() {
return appender;
}
public void setAppender(Appender appender) {
this.appender = appender;
}
/**
* Appends the event
* @param aEvent the LoggingEvent to append
*/
protected void append(LoggingEvent aEvent) {
if (hostname != null) {
aEvent.setProperty(Constants.HOSTNAME_KEY, hostname);
}
if (application != null) {
aEvent.setProperty(Constants.APPLICATION_KEY, application);
}
appender.doAppend(aEvent);
}
/**
* Instantiates and activates an instance of a ChainsawViewer
* to view the contents of this appender.
*/
public void activateOptions() {
if (viewerClassname == null) {
viewerClassname = "org.apache.log4j.chainsaw.DefaultViewer";
}
ChainsawViewer viewer =
(ChainsawViewer) OptionConverter.instantiateByClassName(viewerClassname,
ChainsawViewer.class, null);
if (viewer != null) {
viewer.activateViewer(this);
}
try {
hostname = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException uhe) {
try {
hostname = InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException uhe2) {
}
}
}
/**
* Close does nothing
*/
public void close() {
}
/**
* Sets the viewer class to use to view the events. The class must
* implement the ChainsawViewer interface.
*
* @param classname The class name of the viewer class.
*/
public void setViewerClass(String classname) {
viewerClassname = classname;
}
/**
* Gets the viewer class to use to view the events.
*
* @return The class name of the viewer class.
*/
public String getViewerClass() {
return viewerClassname;
}
/**
* The <b>Application</b> option takes a string value which should be the
* name of the application getting logged
*/
public void setApplication(String lapp) {
this.application = lapp;
}
/**
* Returns value of the <b>Application</b> option.
*/
public String getApplication() {
return application;
}
}