Author: sdeboy
Date: Thu Feb 23 22:42:38 2006
New Revision: 380605

URL: http://svn.apache.org/viewcvs?rev=380605&view=rev
Log:
Initial commit: LogFileXMLReceiver

Added:
    logging/log4j/trunk/src/java/org/apache/log4j/xml/LogFileXMLReceiver.java
    
logging/log4j/trunk/src/java/org/apache/log4j/xml/LogFileXMLReceiverBeanInfo.java
Modified:
    logging/log4j/trunk/build.xml

Modified: logging/log4j/trunk/build.xml
URL: 
http://svn.apache.org/viewcvs/logging/log4j/trunk/build.xml?rev=380605&r1=380604&r2=380605&view=diff
==============================================================================
--- logging/log4j/trunk/build.xml (original)
+++ logging/log4j/trunk/build.xml Thu Feb 23 22:42:38 2006
@@ -735,6 +735,7 @@
                ${stem}/xml/SAXErrorHandler.class,
                 ${stem}/xml/UtilLoggingXMLDecoder.class,
                 ${stem}/xml/XMLDecoder.class,
+                   ${stem}/xml/LogFileXMLReceiver*.class,
                ${stem}/net/SMTPAppender.class,
                ${stem}/net/DefaultEvaluator.class,
                ${stem}/spi/TriggeringEventEvaluator.class,

Added: logging/log4j/trunk/src/java/org/apache/log4j/xml/LogFileXMLReceiver.java
URL: 
http://svn.apache.org/viewcvs/logging/log4j/trunk/src/java/org/apache/log4j/xml/LogFileXMLReceiver.java?rev=380605&view=auto
==============================================================================
--- logging/log4j/trunk/src/java/org/apache/log4j/xml/LogFileXMLReceiver.java 
(added)
+++ logging/log4j/trunk/src/java/org/apache/log4j/xml/LogFileXMLReceiver.java 
Thu Feb 23 22:42:38 2006
@@ -0,0 +1,287 @@
+/*
+ * Copyright 1999,2004 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.xml;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.apache.log4j.helpers.Constants;
+import org.apache.log4j.plugins.Receiver;
+import org.apache.log4j.rule.ExpressionRule;
+import org.apache.log4j.rule.Rule;
+import org.apache.log4j.spi.Decoder;
+import org.apache.log4j.spi.LoggingEvent;
+
+/**
+LogFileXMLReceiver will read an xml-formated log file and make the events in 
the log 
+file available to the log4j framework.  
+
+<p>This receiver supports log files created using log4j's XMLLayout, as well 
as 
+java.util.logging XMLFormatter (via the org.apache.log4j.spi.Decoder 
interface).
+
+<p>By default, log4j's XMLLayout is supported (no need to specify a decoder in 
that case).
+
+<p>To configure this receiver to support java.util.logging's XMLFormatter, 
specify a
+'decoder' param of org.apache.log4j.xml.UtilLoggingXMLDecoder.
+
+<p>Tailing -may- work, but not in all cases (try using a file:// URL).  If a 
process has a log file open,
+the receiver may be able to read and tail the file.  If the process closes the 
file and reopens the file, 
+the receiver may not be able to continue tailing the file.
+
+<p>An expressionFilter may be specified.  Only events passing the expression 
will be forwarded to the log4j framework.
+
+<p>Once the event has been "posted", it will be handled by the
+appenders currently configured in the LoggerRespository.
+
[EMAIL PROTECTED] Scott Deboy <[EMAIL PROTECTED]>
+
+  @since 1.3
+*/
+
+public class LogFileXMLReceiver extends Receiver {
+       private String fileURL;
+       private Rule expressionRule;
+       private String filterExpression;
+       private String decoder = "org.apache.log4j.xml.XMLDecoder";
+       private boolean tailing = false;
+
+       private Decoder decoderInstance;
+       private Reader reader;
+       private static final String FILE_KEY = "file";
+       private String host;
+       private String path;
+
+       /**
+        * Accessor
+        * 
+        * @return file URL
+        */
+       public String getFileURL() {
+               return fileURL;
+       }
+
+       /**
+        * Specify the URL of the XML-formatted file to process.
+        * 
+        * @param fileURL
+        */
+       public void setFileURL(String fileURL) {
+               this.fileURL = fileURL;
+       }
+
+       /**
+        * Accessor
+        * 
+        * @return
+        */
+       public String getDecoder() {
+               return decoder;
+       }
+
+       /**
+        * Specify the class name implementing org.apache.log4j.spi.Decoder that
+        * can process the file.
+        * 
+        * @param _decoder
+        */
+       public void setDecoder(String _decoder) {
+               decoder = _decoder;
+       }
+
+       /**
+        * Accessor
+        * 
+        * @return filter expression
+        */
+       public String getFilterExpression() {
+               return filterExpression;
+       }
+
+       /**
+        * Accessor
+        * 
+        * @return tailing flag
+        */
+       public boolean isTailing() {
+               return tailing;
+       }
+       
+       /**
+        * Set the 'tailing' flag - may only work on file:// URLs and may stop 
tailing if the 
+        * writing process closes the file and reopens.
+        * 
+        * @param tailing
+        */
+       public void setTailing(boolean tailing) {
+               this.tailing = tailing;
+       }
+       /**
+        * Set the filter expression that will cause only events which pass the 
filter
+        * to be forwarded to the log4j framework.
+        * 
+        * @param filterExpression
+        */
+       public void setFilterExpression(String filterExpression) {
+               this.filterExpression = filterExpression;
+       }
+
+       private boolean passesExpression(LoggingEvent event) {
+               if (event != null) {
+                       if (expressionRule != null) {
+                               return (expressionRule.evaluate(event));
+                       }
+               }
+               return true;
+       }
+
+       public static void main(String[] args) {
+               /*
+               LogFileXMLReceiver test = new LogFileXMLReceiver();
+               test.setFileURL("file:///c:/samplelog.xml");
+               test.setFilterExpression("level >= TRACE");
+               test.activateOptions();
+               */
+       }
+
+       /**
+        * Close the receiver, release any resources that are accessing the 
file.
+        */
+       public void shutdown() {
+               try {
+                       if (reader != null) {
+                               reader.close();
+                               reader = null;
+                       }
+               } catch (IOException ioe) {
+                       ioe.printStackTrace();
+               }
+       }
+
+       /**
+        * Process the file
+        */
+       public void activateOptions() {
+               new Thread(new Runnable() {
+                       public void run() {
+                               try {
+                                       URL url = new URL(fileURL);
+                                       host = url.getHost();
+                                       if (host != null && host.equals("")) {
+                                               host = FILE_KEY;
+                                       }
+                                       path = url.getPath();
+                               } catch (MalformedURLException e1) {
+                                       // TODO Auto-generated catch block
+                                       e1.printStackTrace();
+                               }
+
+                               try {
+                                       if (filterExpression != null) {
+                                               expressionRule = ExpressionRule
+                                                               
.getRule(filterExpression);
+                                       }
+                               } catch (Exception e) {
+                                       getLogger()
+                                                       .warn(
+                                                                       
"Invalid filter expression: "
+                                                                               
        + filterExpression, e);
+                               }
+
+                               Class c;
+                               try {
+                                       c = Class.forName(decoder);
+                                       Object o = c.newInstance();
+                                       if (o instanceof Decoder) {
+                                               decoderInstance = (Decoder) o;
+                                       }
+                               } catch (ClassNotFoundException e) {
+                                       // TODO Auto-generated catch block
+                                       e.printStackTrace();
+                               } catch (InstantiationException e) {
+                                       // TODO Auto-generated catch block
+                                       e.printStackTrace();
+                               } catch (IllegalAccessException e) {
+                                       // TODO Auto-generated catch block
+                                       e.printStackTrace();
+                               }
+
+                               try {
+                                       reader = new InputStreamReader(new 
URL(getFileURL())
+                                                       .openStream());
+                                       process(reader);
+                               } catch (FileNotFoundException fnfe) {
+                                       getLogger().info("file not available");
+                               } catch (IOException ioe) {
+                                       getLogger().warn("unable to load file", 
ioe);
+                                       return;
+                               }
+                       }
+               }).start();
+       }
+
+       private void process(Reader unbufferedReader) throws IOException {
+               BufferedReader bufferedReader = new 
BufferedReader(unbufferedReader);
+               char[] content = new char[10000];
+               getLogger().debug("processing starting: " + fileURL);
+               int length = 0;
+               do {
+                       System.out.println("in do loop-about to process");
+                       while ((length = bufferedReader.read(content)) > -1) {
+                               
processEvents(decoderInstance.decodeEvents(String.valueOf(content,
+                                               0, length)));
+                       }
+                       if (tailing) {
+                               try {
+                                       Thread.sleep(5000);
+                               } catch (InterruptedException e) {
+                                       // TODO Auto-generated catch block
+                                       e.printStackTrace();
+                               }
+                       }
+               }
+               while (tailing);
+               getLogger().debug("processing complete: " + fileURL);
+
+               shutdown();
+       }
+
+       private void processEvents(Collection c) {
+               if (c == null) {
+                       return;
+               }
+
+               for (Iterator iter = c.iterator(); iter.hasNext();) {
+                       LoggingEvent evt = (LoggingEvent) iter.next();
+                       if (passesExpression(evt)) {
+                               if (evt.getProperty(Constants.HOSTNAME_KEY) != 
null) {
+                                       evt.setProperty(Constants.HOSTNAME_KEY, 
host);
+                               }
+                               if (evt.getProperty(Constants.APPLICATION_KEY) 
!= null) {
+                                       
evt.setProperty(Constants.APPLICATION_KEY, path);
+                               }
+                               doPost(evt);
+                       }
+               }
+       }
+}
\ No newline at end of file

Added: 
logging/log4j/trunk/src/java/org/apache/log4j/xml/LogFileXMLReceiverBeanInfo.java
URL: 
http://svn.apache.org/viewcvs/logging/log4j/trunk/src/java/org/apache/log4j/xml/LogFileXMLReceiverBeanInfo.java?rev=380605&view=auto
==============================================================================
--- 
logging/log4j/trunk/src/java/org/apache/log4j/xml/LogFileXMLReceiverBeanInfo.java
 (added)
+++ 
logging/log4j/trunk/src/java/org/apache/log4j/xml/LogFileXMLReceiverBeanInfo.java
 Thu Feb 23 22:42:38 2006
@@ -0,0 +1,46 @@
+/*
+ * Copyright 1999,2004 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.xml;
+
+import java.beans.PropertyDescriptor;
+import java.beans.SimpleBeanInfo;
+
+
+/**
+ * BeanInfo class for the meta-data of the LogFileXMLReceiver.
+ *
+ */
+public class LogFileXMLReceiverBeanInfo extends SimpleBeanInfo {
+  /* (non-Javadoc)
+   * @see java.beans.BeanInfo#getPropertyDescriptors()
+   */
+  public PropertyDescriptor[] getPropertyDescriptors() {
+    try {
+      return new PropertyDescriptor[] {
+        new PropertyDescriptor("fileURL", LogFileXMLReceiver.class),
+        new PropertyDescriptor("decoder", LogFileXMLReceiver.class),
+        new PropertyDescriptor("name", LogFileXMLReceiver.class),
+        new PropertyDescriptor("tailing", LogFileXMLReceiver.class),
+        new PropertyDescriptor(
+          "filterExpression", LogFileXMLReceiver.class),
+      };
+    } catch (Exception e) {
+    }
+
+    return null;
+  }
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to