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 ca...@apache.org on 2006/08/31 07:20:04 UTC

svn commit: r438801 - in /logging/log4j/trunk: src/java/org/apache/log4j/helpers/SyslogWriter.java src/java/org/apache/log4j/net/SyslogAppender.java tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java

Author: carnold
Date: Wed Aug 30 22:20:03 2006
New Revision: 438801

URL: http://svn.apache.org/viewvc?rev=438801&view=rev
Log:
Bug 39687: Enable configuring port for SyslogAppender

Modified:
    logging/log4j/trunk/src/java/org/apache/log4j/helpers/SyslogWriter.java
    logging/log4j/trunk/src/java/org/apache/log4j/net/SyslogAppender.java
    logging/log4j/trunk/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java

Modified: logging/log4j/trunk/src/java/org/apache/log4j/helpers/SyslogWriter.java
URL: http://svn.apache.org/viewvc/logging/log4j/trunk/src/java/org/apache/log4j/helpers/SyslogWriter.java?rev=438801&r1=438800&r2=438801&view=diff
==============================================================================
--- logging/log4j/trunk/src/java/org/apache/log4j/helpers/SyslogWriter.java (original)
+++ logging/log4j/trunk/src/java/org/apache/log4j/helpers/SyslogWriter.java Wed Aug 30 22:20:03 2006
@@ -27,6 +27,8 @@
 
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
+import java.net.URL;
+import java.net.MalformedURLException;
 
 
 /**
@@ -39,19 +41,59 @@
   final int SYSLOG_PORT = 514;
   String syslogHost;
   private InetAddress address;
+  private final int port;
   private DatagramSocket ds;
 
   private Logger logger = LogManager.getLogger(SyslogWriter.class);
   StringBuffer buf = new StringBuffer();
   
-  public SyslogWriter(String syslogHost) {
+  /**
+   *  Constructs a new instance of SyslogWriter.
+   *  @param syslogHost host name, may not be null.  A port
+   *  may be specified by following the name or IPv4 literal address with
+   *  a colon and a decimal port number.  To specify a port with an IPv6
+   *  address, enclose the IPv6 address in square brackets before appending
+   *  the colon and decimal port number.
+   */
+  public SyslogWriter(final String syslogHost) {
     this.syslogHost = syslogHost;
+    if (syslogHost == null) {
+        throw new NullPointerException("syslogHost");
+    }
+    
+    String host = syslogHost;
+    int urlPort = -1;
+    
+    //
+    //  If not an unbracketed IPv6 address then
+    //      parse as a URL
+    //
+    if (host.indexOf("[") != -1 || host.indexOf(':') == host.lastIndexOf(':')) {
+        try {
+            URL url = new URL("http://" + host);
+            if (url.getHost() != null) {
+                host = url.getHost();
+                //   if host is a IPv6 literal, strip off the brackets
+                if(host.startsWith("[") && host.charAt(host.length() - 1) == ']') {
+                    host = host.substring(1, host.length() - 1);
+                }
+                urlPort = url.getPort();
+            }
+        } catch(MalformedURLException e) {
+      		logger.warn("Malformed URL: will attempt to interpret as InetAddress.", e);
+        }
+    }
+    
+    if (urlPort == -1) {
+        urlPort = SYSLOG_PORT;
+    }
+    port = urlPort;
 
     try {
-      this.address = InetAddress.getByName(syslogHost);
+      this.address = InetAddress.getByName(host);
     } catch (UnknownHostException e) {
       logger.error(
-        "Could not find " + syslogHost + ". All logging will FAIL.", e);
+        "Could not find " + host + ". All logging will FAIL.", e);
     }
 
     try {
@@ -59,7 +101,7 @@
     } catch (SocketException e) {
       e.printStackTrace();
       logger.error(
-        "Could not instantiate DatagramSocket to " + syslogHost
+        "Could not instantiate DatagramSocket to " + host
         + ". All logging will FAIL.", e);
     }
   }
@@ -77,7 +119,7 @@
     logger.debug("Writing out [{}]", buf);
     byte[] bytes = buf.toString().getBytes();
     DatagramPacket packet =
-      new DatagramPacket(bytes, bytes.length, address, SYSLOG_PORT);
+      new DatagramPacket(bytes, bytes.length, address, port);
 
     if (this.ds != null && this.address != null) {
       ds.send(packet);

Modified: logging/log4j/trunk/src/java/org/apache/log4j/net/SyslogAppender.java
URL: http://svn.apache.org/viewvc/logging/log4j/trunk/src/java/org/apache/log4j/net/SyslogAppender.java?rev=438801&r1=438800&r2=438801&view=diff
==============================================================================
--- logging/log4j/trunk/src/java/org/apache/log4j/net/SyslogAppender.java (original)
+++ logging/log4j/trunk/src/java/org/apache/log4j/net/SyslogAppender.java Wed Aug 30 22:20:03 2006
@@ -286,7 +286,9 @@
 
   /**
    * The <b>SyslogHost</b> option is the name of the the syslog host where log
-   * output should go.
+   * output should go.  A non-default port can be specified by
+   * appending a colon and port number to a host name,
+   * an IPv4 address or an IPv6 address enclosed in square brackets.
    *
    * <b>WARNING</b> If the SyslogHost is not set, then this appender will fail.
    */

Modified: logging/log4j/trunk/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/trunk/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java?rev=438801&r1=438800&r2=438801&view=diff
==============================================================================
--- logging/log4j/trunk/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java (original)
+++ logging/log4j/trunk/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java Wed Aug 30 22:20:03 2006
@@ -351,4 +351,47 @@
       "Expected message from log4j unit test SyslogAppenderTest.testAppend.", e);
     assertEquals(0, errorHandler.size());
   }
+
+  /**
+    *  Tests SyslogAppender with IPv6 address.
+    */  
+  public void testIPv6() {
+      SyslogAppender appender = new SyslogAppender();
+      appender.setSyslogHost("::1");
+  }
+
+  /**
+    *  Tests SyslogAppender with IPv6 address enclosed in square brackets.
+    */  
+  public void testIPv6InBrackets() {
+      SyslogAppender appender = new SyslogAppender();
+      appender.setSyslogHost("[::1]");
+  }
+
+  /**
+    *  Tests SyslogAppender with IPv6 address enclosed in square brackets
+    *     followed by port specification.
+    */  
+  public void testIPv6AndPort() {
+      SyslogAppender appender = new SyslogAppender();
+      appender.setSyslogHost("[::1]:1514");
+  }
+
+  /**
+    *  Tests SyslogAppender with host name enclosed in square brackets
+    *     followed by port specification.
+    */  
+  public void testHostNameAndPort() {
+      SyslogAppender appender = new SyslogAppender();
+      appender.setSyslogHost("localhost:1514");
+  }
+
+
+  /**
+    *  Tests SyslogAppender with IPv4 address followed by port specification.
+    */  
+  public void testIPv4AndPort() {
+      SyslogAppender appender = new SyslogAppender();
+      appender.setSyslogHost("127.0.0.1:1514");
+  }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org