View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.log4j.chainsaw;
18  
19  import org.apache.log4j.Appender;
20  import org.apache.log4j.AppenderSkeleton;
21  import org.apache.log4j.helpers.Constants;
22  import org.apache.log4j.helpers.OptionConverter;
23  import org.apache.log4j.spi.LoggingEvent;
24  
25  import java.net.InetAddress;
26  import java.net.UnknownHostException;
27  
28  
29  /**
30   * ChainsawAppender receives LoggingEvents from the local
31   * Log4J environment, and appends them into a model that
32   * can be used inside a Swing GUI
33   *
34   * @author Paul Smith
35   * @version 1.0
36   */
37  public class ChainsawAppender
38      extends AppenderSkeleton {
39  
40      private Appender appender;
41  
42      /**
43       * The in-JVM singleton instance of the ChainsawAppender.
44       * <p>
45       * If somehow Log4j initialises more than one, then the first one to
46       * initialise wins!
47       */
48      private static ChainsawAppender sSharedAppender = null;
49  
50      /**
51       * The classname of the viewer to create to view the events.
52       */
53      private String viewerClassname;
54      private String hostname = "localhost";
55      private String application = "app";
56  
57      /**
58       * Constructor, initialises the singleton instance of the appender
59       */
60      public ChainsawAppender() {
61          super(false);
62          synchronized (ChainsawAppender.class) {
63              if (sSharedAppender == null) {
64                  sSharedAppender = this;
65              }
66          }
67      }
68  
69      /**
70       * Return the singleton instance of the ChainsawAppender, it should only
71       * be initialised once.
72       *
73       * @return the One and only instance of the ChainsawAppender that is
74       * allowed to be referenced by the GUI
75       */
76      static ChainsawAppender getInstance() {
77          return sSharedAppender;
78      }
79  
80      /**
81       * This appender does not require layout and so return false
82       *
83       * @return false and only false
84       */
85      public boolean requiresLayout() {
86          return false;
87      }
88  
89      public Appender getAppender() {
90          return appender;
91      }
92  
93      public void setAppender(Appender appender) {
94          this.appender = appender;
95      }
96  
97      /**
98       * Appends the event
99       *
100      * @param aEvent the LoggingEvent to append
101      */
102     protected void append(LoggingEvent aEvent) {
103         if (hostname != null) {
104             aEvent.setProperty(Constants.HOSTNAME_KEY, hostname);
105         }
106 
107         if (application != null) {
108             aEvent.setProperty(Constants.APPLICATION_KEY, application);
109         }
110 
111         appender.doAppend(aEvent);
112     }
113 
114     /**
115      * Instantiates and activates an instance of a ChainsawViewer
116      * to view the contents of this appender.
117      */
118     public void activateOptions() {
119         if (viewerClassname == null) {
120             viewerClassname = "org.apache.log4j.chainsaw.DefaultViewer";
121         }
122 
123         ChainsawViewer viewer =
124             (ChainsawViewer) OptionConverter.instantiateByClassName(viewerClassname,
125                 ChainsawViewer.class, null);
126 
127         if (viewer != null) {
128             viewer.activateViewer(this);
129         }
130         try {
131             hostname = InetAddress.getLocalHost().getHostName();
132         } catch (UnknownHostException uhe) {
133             try {
134                 hostname = InetAddress.getLocalHost().getHostAddress();
135             } catch (UnknownHostException uhe2) {
136             }
137         }
138     }
139 
140     /**
141      * Close does nothing
142      */
143     public void close() {
144     }
145 
146     /**
147      * Sets the viewer class to use to view the events.  The class must
148      * implement the ChainsawViewer interface.
149      *
150      * @param classname The class name of the viewer class.
151      */
152     public void setViewerClass(String classname) {
153         viewerClassname = classname;
154     }
155 
156     /**
157      * Gets the viewer class to use to view the events.
158      *
159      * @return The class name of the viewer class.
160      */
161     public String getViewerClass() {
162         return viewerClassname;
163     }
164 
165     /**
166      * The <b>Application</b> option takes a string value which should be the
167      * name of the application getting logged
168      */
169     public void setApplication(String lapp) {
170         this.application = lapp;
171     }
172 
173     /**
174      * Returns value of the <b>Application</b> option.
175      */
176     public String getApplication() {
177         return application;
178     }
179 
180 
181 }