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]