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 06:48:55 UTC

svn commit: r438792 - in /logging/log4j/branches/v1_2-branch: 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 21:48:55 2006
New Revision: 438792

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

Modified:
    logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/helpers/SyslogWriter.java
    logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/net/SyslogAppender.java
    logging/log4j/branches/v1_2-branch/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java

Modified: logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/helpers/SyslogWriter.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/helpers/SyslogWriter.java?rev=438792&r1=438791&r2=438792&view=diff
==============================================================================
--- logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/helpers/SyslogWriter.java (original)
+++ logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/helpers/SyslogWriter.java Wed Aug 30 21:48:55 2006
@@ -24,6 +24,8 @@
 import java.net.UnknownHostException;
 import java.net.SocketException;
 import java.io.IOException;
+import java.net.URL;
+import java.net.MalformedURLException;
 
 /**
    SyslogWriter is a wrapper around the java.net.DatagramSocket class
@@ -34,20 +36,64 @@
 public class SyslogWriter extends Writer {
 
   final int SYSLOG_PORT = 514;
+  /**
+   *  Host string from last constructed SyslogWriter.
+   *  @deprecated
+   */
   static String syslogHost;
   
   private InetAddress address;
+  private final int port;
   private DatagramSocket ds;
 
+  /**
+   *  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(String syslogHost) {
+  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) {
+      		LogLog.error("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) {
-      LogLog.error("Could not find " + syslogHost +
+      LogLog.error("Could not find " + host +
 			 ". All logging will FAIL.", e);
     }
 
@@ -56,9 +102,10 @@
     }
     catch (SocketException e) {
       e.printStackTrace(); 
-      LogLog.error("Could not instantiate DatagramSocket to " + syslogHost +
+      LogLog.error("Could not instantiate DatagramSocket to " + host +
 			 ". All logging will FAIL.", e);
     }
+    
   }
 
 
@@ -71,7 +118,7 @@
   void write(String string) throws IOException {
     byte[] bytes = string.getBytes();
     DatagramPacket packet = new DatagramPacket(bytes, bytes.length,
-					       address, SYSLOG_PORT);
+					       address, port);
 
     if(this.ds != null && this.address != null)
       ds.send(packet);

Modified: logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/net/SyslogAppender.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/net/SyslogAppender.java?rev=438792&r1=438791&r2=438792&view=diff
==============================================================================
--- logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/net/SyslogAppender.java (original)
+++ logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/net/SyslogAppender.java Wed Aug 30 21:48:55 2006
@@ -287,13 +287,15 @@
 
   /**
     The <b>SyslogHost</b> option is the name of the the syslog host
-    where log output should go.
+    where log 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.
    */
   public
-  void setSyslogHost(String syslogHost) {
+  void setSyslogHost(final String syslogHost) {
     this.sqw = new SyslogQuietWriter(new SyslogWriter(syslogHost),
 				     syslogFacility, errorHandler);
     //this.stp = new SyslogTracerPrintWriter(sqw);

Modified: logging/log4j/branches/v1_2-branch/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/v1_2-branch/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java?rev=438792&r1=438791&r2=438792&view=diff
==============================================================================
--- logging/log4j/branches/v1_2-branch/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java (original)
+++ logging/log4j/branches/v1_2-branch/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java Wed Aug 30 21:48:55 2006
@@ -339,4 +339,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