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 2008/01/17 21:10:25 UTC

svn commit: r612959 - /logging/log4j/trunk/src/main/java/org/apache/log4j/net/TelnetAppender.java

Author: carnold
Date: Thu Jan 17 12:10:23 2008
New Revision: 612959

URL: http://svn.apache.org/viewvc?rev=612959&view=rev
Log:
Bug 44108: TelnetAppender misses messages when one of many clients disconnect

Modified:
    logging/log4j/trunk/src/main/java/org/apache/log4j/net/TelnetAppender.java

Modified: logging/log4j/trunk/src/main/java/org/apache/log4j/net/TelnetAppender.java
URL: http://svn.apache.org/viewvc/logging/log4j/trunk/src/main/java/org/apache/log4j/net/TelnetAppender.java?rev=612959&r1=612958&r2=612959&view=diff
==============================================================================
--- logging/log4j/trunk/src/main/java/org/apache/log4j/net/TelnetAppender.java (original)
+++ logging/log4j/trunk/src/main/java/org/apache/log4j/net/TelnetAppender.java Thu Jan 17 12:10:23 2008
@@ -17,13 +17,17 @@
 
 package org.apache.log4j.net;
 
-import java.io.*;
-import java.net.*;
-import java.util.*;
-import org.apache.log4j.Layout;
-import org.apache.log4j.spi.LoggingEvent;
 import org.apache.log4j.AppenderSkeleton;
 import org.apache.log4j.helpers.LogLog;
+import org.apache.log4j.spi.LoggingEvent;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.Vector;
 
 /**
   <p>The TelnetAppender is a log4j appender that specializes in
@@ -104,15 +108,16 @@
     message to each connected client.  */
   protected void append(LoggingEvent event) {
       if(sh != null) {
-        sh.send(this.layout.format(event));
+        sh.send(layout.format(event));
         if(layout.ignoresThrowable()) {
             String[] s = event.getThrowableStrRep();
             if (s != null) {
-	            int len = s.length;
-	            for(int i = 0; i < len; i++) {
-	                sh.send(s[i]);
-	                sh.send(Layout.LINE_SEP);
-	            }
+                StringBuffer buf = new StringBuffer();
+                for(int i = 0; i < s.length; i++) {
+                    buf.append(s[i]);
+                    buf.append("\r\n");
+                }
+                sh.send(buf.toString());
             }
         }
       }
@@ -139,10 +144,12 @@
     * @since 1.2.15 
     */
     public void close() {
-      for(Enumeration e = connections.elements();e.hasMoreElements();) {
-        try {
-          ((Socket)e.nextElement()).close();
-        } catch(Exception ex) {
+      synchronized(this) {
+        for(Enumeration e = connections.elements();e.hasMoreElements();) {
+            try {
+                ((Socket)e.nextElement()).close();
+            } catch(Exception ex) {
+            }
         }
       }
 
@@ -153,16 +160,15 @@
     }
 
     /** sends a message to each of the clients in telnet-friendly output. */
-    public void send(String message) {
-      Enumeration ce = connections.elements();
-      for(Enumeration e = writers.elements();e.hasMoreElements();) {
-        Socket sock = (Socket)ce.nextElement();
-        PrintWriter writer = (PrintWriter)e.nextElement();
+    public synchronized void send(final String message) {
+      Iterator ce = connections.iterator();
+      for(Iterator e = writers.iterator();e.hasNext();) {
+        ce.next();
+        PrintWriter writer = (PrintWriter)e.next();
         writer.print(message);
         if(writer.checkError()) {
-          // The client has closed the connection, remove it from our list:
-          connections.remove(sock);
-          writers.remove(writer);
+          ce.remove();
+          e.remove();
         }
       }
     }
@@ -177,11 +183,13 @@
           Socket newClient = serverSocket.accept();
           PrintWriter pw = new PrintWriter(newClient.getOutputStream());
           if(connections.size() < MAX_CONNECTIONS) {
-            connections.addElement(newClient);
-            writers.addElement(pw);
-            pw.print("TelnetAppender v1.0 (" + connections.size() 
-		     + " active connections)\r\n\r\n");
-            pw.flush();
+            synchronized(this) {
+                connections.addElement(newClient);
+                writers.addElement(pw);
+                pw.print("TelnetAppender v1.0 (" + connections.size()
+		            + " active connections)\r\n\r\n");
+                pw.flush();
+            }
           } else {
             pw.print("Too many connections.\r\n");
             pw.flush();



---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org