Author: carnold
Date: Sat Apr 21 00:10:22 2007
New Revision: 530990
URL: http://svn.apache.org/viewvc?view=rev&rev=530990
Log:
Bug 42087: SyslogAppender packets not limited to 1024 bytes
Modified:
logging/log4j/branches/v1_2-branch/docs/HISTORY.txt
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/src/xdocs/download.xml
logging/log4j/branches/v1_2-branch/tests/src/java/org/apache/log4j/net/SyslogAppenderTest.java
Modified: logging/log4j/branches/v1_2-branch/docs/HISTORY.txt
URL:
http://svn.apache.org/viewvc/logging/log4j/branches/v1_2-branch/docs/HISTORY.txt?view=diff&rev=530990&r1=530989&r2=530990
==============================================================================
--- logging/log4j/branches/v1_2-branch/docs/HISTORY.txt (original)
+++ logging/log4j/branches/v1_2-branch/docs/HISTORY.txt Sat Apr 21 00:10:22 2007
@@ -40,6 +40,7 @@
41708: PropertyPrinter.printOptions breaking signature change in
log4j 1.2.9
41735: RollingFileAppender may delete files during rollover
33708: XMLConfiguration of loggerFactory does not work
+ 42087: SyslogAppender does not limit packet size to 1024 bytes
September 18th, 2006
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?view=diff&rev=530990&r1=530989&r2=530990
==============================================================================
---
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
Sat Apr 21 00:10:22 2007
@@ -116,13 +116,21 @@
}
public
- void write(String string) throws IOException {
- byte[] bytes = string.getBytes();
- DatagramPacket packet = new DatagramPacket(bytes, bytes.length,
- address, port);
+ void write(final String string) throws IOException {
- if(this.ds != null && this.address != null)
- ds.send(packet);
+ if(this.ds != null && this.address != null) {
+ byte[] bytes = string.getBytes();
+ //
+ // syslog packets must be less than 1024 bytes
+ //
+ int bytesLength = bytes.length;
+ if (bytesLength >= 1024) {
+ bytesLength = 1024;
+ }
+ DatagramPacket packet = new DatagramPacket(bytes, bytesLength,
+ address, port);
+ 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?view=diff&rev=530990&r1=530989&r2=530990
==============================================================================
---
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
Sat Apr 21 00:10:22 2007
@@ -271,6 +271,22 @@
}
}
+
+ private void splitPacket(final String pri, final String packet) {
+ int byteCount = packet.getBytes().length;
+ //
+ // if packet is less than RFC 3164 limit
+ // of 1024 bytes, then write it
+ //
+ if (byteCount <= 1024) {
+ sqw.write(packet);
+ } else {
+ int split = pri.length() + (packet.length() - pri.length())/2;
+ splitPacket(pri, packet.substring(0, split) + "...");
+ splitPacket(pri, pri + "..." + packet.substring(split));
+ }
+ }
+
public
void append(LoggingEvent event) {
@@ -292,18 +308,27 @@
}
String hdr = getPacketHeader(event.timeStamp);
+ String pri = hdr;
String packet = layout.format(event);
if(facilityPrinting || hdr.length() > 0) {
StringBuffer buf = new StringBuffer(hdr);
if(facilityPrinting) {
buf.append(facilityStr);
+ pri = buf.toString();
}
buf.append(packet);
packet = buf.toString();
}
sqw.setLevel(event.getLevel().getSyslogEquivalent());
- sqw.write(packet);
+ //
+ // if message has a remote likelihood of exceeding 1024 bytes
+ // when encoded, consider splitting message into multiple packets
+ if (packet.length() > 256) {
+ splitPacket(pri, packet);
+ } else {
+ sqw.write(packet);
+ }
if (layout.ignoresThrowable()) {
String[] s = event.getThrowableStrRep();
Modified: logging/log4j/branches/v1_2-branch/src/xdocs/download.xml
URL:
http://svn.apache.org/viewvc/logging/log4j/branches/v1_2-branch/src/xdocs/download.xml?view=diff&rev=530990&r1=530989&r2=530990
==============================================================================
--- logging/log4j/branches/v1_2-branch/src/xdocs/download.xml (original)
+++ logging/log4j/branches/v1_2-branch/src/xdocs/download.xml Sat Apr 21
00:10:22 2007
@@ -65,6 +65,7 @@
<li><a
href="http://issues.apache.org/bugzilla/show_bug.cgi?id=41708">41708</a>:
PropertyPrinter.printOptions breaking signature change in log4j 1.2.9</li>
<li><a
href="http://issues.apache.org/bugzilla/show_bug.cgi?id=41735">41735</a>:
RollingFileAppender may delete files during rollover</li>
<li><a
href="http://issues.apache.org/bugzilla/show_bug.cgi?id=33708">33708</a>: XML
configuration of loggerFactory does not work</li>
+ <li><a
href="http://issues.apache.org/bugzilla/show_bug.cgi?id=42087">42087</a>:
SyslogAppender does not limit packet size to 1024 bytes</li>
</ul>
</li>
</ul>
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?view=diff&rev=530990&r1=530989&r2=530990
==============================================================================
---
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
Sat Apr 21 00:10:22 2007
@@ -545,4 +545,49 @@
assertEquals("<14></table>", s[2].substring(0,12));
}
+ /**
+ * Tests that syslog packets do not exceed 1024 bytes.
+ * See bug 42087.
+ * @throws Exception if exception during test.
+ */
+ public void testBigPackets() throws Exception {
+ DatagramSocket ds = new DatagramSocket();
+ ds.setSoTimeout(2000);
+
+ SyslogAppender appender = new SyslogAppender();
+ appender.setSyslogHost("localhost:" + ds.getLocalPort());
+ appender.setName("name");
+ appender.setHeader(false);
+ PatternLayout pl = new PatternLayout("%m");
+ appender.setLayout(pl);
+ appender.activateOptions();
+
+ Logger l = Logger.getRootLogger();
+ l.addAppender(appender);
+ StringBuffer msgbuf = new StringBuffer();
+ while(msgbuf.length() < 8000) {
+ msgbuf.append("0123456789");
+ }
+ String msg = msgbuf.toString();
+ l.info(msg);
+ appender.close();
+ String[] s = new String[8];
+ byte[] buf = new byte[1200];
+ for(int i = 0; i < 8; i++) {
+ DatagramPacket p = new DatagramPacket(buf, 0, buf.length);
+ ds.receive(p);
+ assertTrue(p.getLength() <= 1024);
+ s[i] = new String(p.getData(), 0, p.getLength());
+ }
+ ds.close();
+ StringBuffer rcvbuf = new StringBuffer(s[0]);
+ rcvbuf.delete(0, 4);
+ for(int i = 1; i < 8; i++) {
+ rcvbuf.setLength(rcvbuf.length() - 3);
+ rcvbuf.append(s[i].substring(s[i].indexOf("...") + 3));
+ }
+ assertEquals(msg.length(), rcvbuf.length());
+ assertEquals(msg, rcvbuf.toString());
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]