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]

Reply via email to