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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]