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