Title: RE: TelnetAppender

   Yes, that would be fine.  Also, if anyone runs into problems or has suggestions for the appender, I would like to hear them.

Thanks.
J

> -----Original Message-----
> From: Ceki Gülcü [mailto:[EMAIL PROTECTED]]
> Sent: Wednesday, July 18, 2001 2:37 PM
> To: LOG4J Developers Mailing List
> Cc: [EMAIL PROTECTED]
> Subject: Re: TelnetAppender
>
>
>
> Jay,
>
> I forgot to mention that all material contributed to an
> Apache project must be
> distributed under the Apache software license. Do you intend
> to contribute your
> code to the Apache Software Foundation? Regards, Ceki
>
> At 10:45 17.07.2001 -0600, Jay Funnell wrote:
>
> >import java.io.*;
> >import java.net.*;
> >import java.util.*;
> >import org.apache.log4j.Layout;
> >import org.apache.log4j.spi.Filter;
> >import org.apache.log4j.spi.ErrorHandler;
> >import org.apache.log4j.spi.OptionHandler;
> >import org.apache.log4j.spi.LoggingEvent;
> >import org.apache.log4j.helpers.OnlyOnceErrorHandler;
> >import org.apache.log4j.helpers.LogLog;
> >import org.apache.log4j.AppenderSkeleton;
> >
> >/** The TelnetAppender is a log4j appender that specializes
> in writing to a read-only
> >  * socket.  The output is provided in a telnet-friendly way
> so that a log can be
> >  * monitored over TCP/IP.  Clients using telnet connect to
> the socket and receive
> >  * log data.  This is handy for remote monitoring,
> especially when monitoring a servlet.
> >  *
> >  * Here is a list of the available configuration options:
> >  *
> >  * <table border=1>
> >  *   <tr>
> >  *     <th>Name</th>
> >  *     <th>Requirement</th>
> >  *     <th>Description</th>
> >  *     <th>Sample Value</th>
> >  *   </tr>
> >  *   <tr>
> >  *     <td>Port</td>
> >  *     <td>optional</td>
> >  *     <td>This parameter determines the port to use for
> announcing log events.  The default port is 23 (telnet).</td>
> >  *     <td>5875</td>
> >  * </table>
> >  *
> >  * @author <a
> HREF=""<mailto:[EMAIL PROTECTED]>mailto:[EMAIL PROTECTED]">Jay Funnell</a>
> >  */
> >
> >public class TelnetAppender extends AppenderSkeleton {
> >
> >  private SocketHandler sh;
> >  private int port = 23;
> >  private static final String PORT_OPTION = "Port";
> > 
> >  /** this appender requires a layout to format the text to
> the attached client(s). */
> >  public boolean requiresLayout() {
> >    return true;
> >  }
> > 
> >  /** all of the options have been set, create the socket
> handler and wait for connections. */
> >  public void activateOptions() {
> >    try {
> >      sh = new SocketHandler(port);
> >      sh.start();
> >    }
> >    catch(Exception e) {
> >      e.printStackTrace();
> >    }
> >  }
> > 
> >  /** sets an option on this appender. */
> >  public void setOption(String key, String value) {
> >    if(key.equalsIgnoreCase(PORT_OPTION)) {
> >      port = Integer.parseInt(value);
> >    }
> >  }
> > 
> >  /** determines the options that this appender allows. */
> >  public String[] getOptionStrings() {
> >    return new String[] {
> >      PORT_OPTION
> >    };
> >  }
> >
> >  /** shuts down the appender. */
> >  public void close() {
> >    sh.finalize();
> >  }
> > 
> >  /** Handles a log event.  For this appender, that means
> writing the message to each
> >    * connected client.
> >    */
> >  protected void append(LoggingEvent event) {
> >    sh.send(this.layout.format(event));
> >    if(layout.ignoresThrowable()) {
> >      if(event.throwable != null) {
> >        ByteArrayOutputStream bout = new ByteArrayOutputStream();
> >        PrintWriter pw = new PrintWriter(bout);
> >        event.throwable.printStackTrace(pw);
> >        pw.close();
> >        sh.send(bout.toString());
> >      }
> >      else {
> >        if(event.throwableInformation != null) {
> >          sh.send(event.throwableInformation);
> >        }
> >      }
> >    }
> >  }
> > 
> > 
> //----------------------------------------------------------
> SocketHandler:
> > 
> >  /** The SocketHandler class is used to accept connections
> from clients.  It is threaded
> >      so that clients can connect/disconnect asynchronously. */
> >  protected class SocketHandler extends Thread {
> >
> >    private Vector writers = new Vector();
> >    private Vector connections = new Vector();
> >    private ServerSocket serverSocket;
> >    private int MAX_CONNECTIONS = 20;
> >   
> >    /** make sure we close all network connections when this
> handler is destroyed. */
> >    public void finalize() {
> >      for(Enumeration e =
> connections.elements();e.hasMoreElements();) {
> >        try {
> >          ((Socket)e.nextElement()).close();
> >        }
> >        catch(Exception ex) {
> >        }
> >      }
> >      try {
> >        serverSocket.close();
> >      }
> >      catch(Exception ex) {       
> >      }
> >    }
> >   
> >    /** 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();
> >        writer.print(message);
> >        if(writer.checkError()) {
> >         
> >          // The client has closed the connection, remove it
> from our list:
> >
> >          connections.remove(sock);
> >          writers.remove(writer);
> >
> >        }
> >      }
> >    }
> >   
> >    /** continually accepts client connections.  Client
> connections are refused when MAX_CONNECTIONS
> >        is reached. */
> >    public void run() {
> >      while(true) {
> >        try {
> >          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();
> >          }
> >          else {
> >            pw.print("Too many connections.\r\n");
> >            pw.flush();
> >            newClient.close();
> >          }
> >        }
> >        catch(Exception e) {
> >          e.printStackTrace();
> >        }
> >      }
> >    }
> >
> >    public SocketHandler(int port) throws IOException {
> >      serverSocket = new ServerSocket(port);
> >    }
> >
> >  }
> >}
>
> --
> Ceki Gülcü - http://qos.ch
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>

Reply via email to