You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by sd...@apache.org on 2006/02/24 07:42:41 UTC

svn commit: r380605 - in /logging/log4j/trunk: build.xml src/java/org/apache/log4j/xml/LogFileXMLReceiver.java src/java/org/apache/log4j/xml/LogFileXMLReceiverBeanInfo.java

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.
+
+@author Scott Deboy <sd...@apache.org>
+
+  @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: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org