The TelnetAppender is extremely convenient, providing access to the running 
log no matter where you are, since nearly all operating systems now have a 
basic telnet client built into them. Unfortunately I was unable to live 
with the most glaring shortcoming, that the appender forces you to wait 
until you have sufficient lines of output to make a judgement about the 
context in which things are happening. You would not be able to tell 
someone to connect to serverX to see what you've found without also saying 
"ok, you're connected yet? Lemme do it again, watch..." What the 
TelnetAppender needs is a backlog of lines so that any newly connecting 
client will immediately show more of what's happening, making things that 
much easier on the user.

Unfortunately the changes need to be made to the inner class, so I was 
unable to subclass the TelnetAppender to make a, say, TelnetTailAppender. 
The class I have been using has been a direct derivative of the original. 
The changes I am suggesting could easily be added to the existing 
TelnetAppender without incurring any backward incompatibilities - if you 
added a setter to assign the number of lines to backlog and default to 
zero, then a program that expected the old behavior and did not set the 
backlog count would experience that behavior.

The following are the changes to TelnetAppender.SocketHandler, in which I 
have hard-coded to 100 lines of backlog.

        private String[] backLog = new String[100];
        private int backLogIndex = 0;

        /**
         * New method, adds a message to the backlog and moves the index
         */
        private void appendBackLog(String message){
                synchronized(backLog){
                        backLog[backLogIndex] = message;
                        if(++backLogIndex == backLog.length){
                                backLogIndex = 0;
                        }
                }
        }
        
        /**
         * New method, sends the contents of the backlog (if any) to the
         * specified print writer, presumably the newly connected telnet
         * client
         */
        private void sendBackLog(PrintWriter pw){
                synchronized(backLog){
                        for(int i=backLogIndex;i<backLog.length;i++){
                                if(backLog[i]!=null){
                                        pw.print(backLog[i]);
                                }
                        }
                        for(int i=0;i<backLogIndex;i++){
                                pw.print(backLog[i]);
                        }
                }
        }

In run() method, after a new connection has been accepted:

        sendBackLog(pw);

in send(String message) method, at first line:

        appendBackLog(message);



Any comments? Reasons of why this is not a good solution? Features of 
another appender that I am not aware of?

Regards,
John Churchill


--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to