Hello, Developers!

Pleased to hear of my nomination, thank you for your trust!
I feel an almost irresistable desire to patch everything I work with :)

Meanwhile I've hit a trouble with ServletOutputLogTarget
and would like to discuss it.

----

I'm no Win2K, running Tomcat 3.1.1a (I do need it).
Running Fortress + LogKit inside a servlet I found that my servlet log
was looking funny: every message from LogKit had an extra
newline after it. I recall I used to have this trouble already a
couple of years ago using Cocoon1, maybe it was running
a version of LogKit?

As a quick fix I just altered ServletOutputLogTarget.write()
to trim any trailing \r\n or \n, as the ServletContext.log()
will append one on its own.

Is this a good solution?
A deeper investigation of the matter follows.

----

I'm trying to figure out how this all works:
(please correct me where I'm wrong)

We can't take a newline out of the pattern
as otherwise we would have nothing to separate
%{throwable} from the rest of the message
(I uderstand %{throwable} will have its own
newline at the end):

    ... %{message}\n%{throwable}

So, currently

* the formatter _always_ produces
  a newline at the tail of the message String
  
* StreamTarget puts the string to file
  as it is (with the newline from the fomatter)

So, options are

1)

* with all the targets logging to 3-rd party
  logging systems which will be upset by trailing newlines
  trim the trailing newlines in the LogTarget
  (what I do in my patch)

2)

* teach the formatter not to output a trailing
  newline

* teach StreamTarget and all the other targets
  that are under our control to append a newline
  at the end of the message if we do need this

* do not perform any special trailing newline
  handling in all the LogTargets that output to
  3-rd party logging systems
  (haven't studied it myself, probably it's
  just the way they are written now)

-----

Approach 1) seems more conservative and perferable in
the short run (it fixes my problme immediately :-)
So I propose it in my patch.

However, if we deeply compare 1) vs. 2) we'll see
that it is probably clearner to to do 2).
The number of LogTargets that are bridges to
3-rd party logging systems is _potentially_ significantly
larger then the number of LogTargets that we implement
"at home". It is also a reasonable assumption that the
3-rd party logging systems generally either

* do not expect a traling newline
  ( every reasonable logging system
    should accept foo.log("Hello, world!") )
  and blindly append a new newline at the end of
  each message

or

* are wise enough to check for the trailing newline
  and can handle both

But, as a number of 3-rd party systems blindly appending
a newline is expected to exist maybe in the long run the
2) solution is preferable?

------

So, here's Patch that does 1) for the ServletOutputLogTarget
and here are my ideas on why 2) is worth being consided
for future implementation, Cheers! :-)

------

The patch also fixes a couple documentation bits
and a build message that have caught my eye.

------

WBR, Anton

------

diff -ru avalon-logkit.orig/build.xml avalon-logkit/build.xml
--- avalon-logkit.orig/build.xml        2003-05-19 03:04:24.000000000 +0400
+++ avalon-logkit/build.xml     2003-06-04 18:28:24.000000000 +0400
@@ -223,7 +223,7 @@
     <echo>*  parent directory.</echo>
     <echo>*</echo>
     <echo>*  In order to not let the build fail completely, I'll</echo>
-    <echo>*  created a directory ${avalon-site.dir}/lib.</echo>
+    <echo>*  create a directory ${avalon-site.dir}/lib.</echo>
     <echo>*</echo>
     <echo>******************************************************</echo>
     <echo/>
diff -ru avalon-logkit.orig/src/java/org/apache/log/output/ServletOutputLogTarget.java 
avalon-logkit/src/java/org/apache/log/output/ServletOutputLogTarget.java
--- avalon-logkit.orig/src/java/org/apache/log/output/ServletOutputLogTarget.java      
 2003-04-07 15:37:36.000000000 +0400
+++ avalon-logkit/src/java/org/apache/log/output/ServletOutputLogTarget.java    
2003-06-05 10:04:31.000000000 +0400
@@ -93,18 +93,41 @@
     }
 
     /**
-     * Logs message to servlet context log file
+     * Logs message to servlet context log file.
+     * ServletContext.log() does append a newline
+     * after our message, so we'll trim it here
+     * if we find any.
      *
      * @param message message to log to servlet context log file.
      */
     protected void write( final String message )
     {
+        final int len = message.length();
+
+        final char last = len > 0 ? message.charAt( len - 1 ) : 0;
+        final char prev = len > 1 ? message.charAt( len - 2 ) : 0;
+
+        final String trimmedMessage;
+
+        if ( prev == '\r' && last == '\n' )
+        {
+            trimmedMessage = message.substring( 0, len - 2 );
+        }
+        else if ( last == '\n' )
+        {
+            trimmedMessage = message.substring( 0, len - 1 );
+        }
+        else
+        {
+            trimmedMessage = message;
+        }
+
         final ServletContext context = m_context;
         if( null != context )
         {
             synchronized( context )
             {
-                context.log( message );
+                context.log( trimmedMessage );
             }
         }
     }
diff -ru avalon-logkit.orig/src/xdocs/whitepaper.xml 
avalon-logkit/src/xdocs/whitepaper.xml
--- avalon-logkit.orig/src/xdocs/whitepaper.xml 2002-08-19 13:30:54.000000000 +0400
+++ avalon-logkit/src/xdocs/whitepaper.xml      2003-06-03 18:32:45.000000000 +0400
@@ -275,6 +275,7 @@
 <source xml:space="preserve">
 format: "%7.7{priority} %5.5{rtime} [%8.8{category}]: %{message}\n%{throwable}"
 output: DEBUG   123   [network.]: This is a debug message
+output: DEBUG   123   [network ]: This is another debug message
 
 format: "%7.7{priority} %5.5{rtime} [%{category}]: %{message}\n"
 output: DEBUG   123   [network.interceptor.connected]: This is a debug message
@@ -302,7 +303,7 @@
         an ExtendedPatternFormatter that included information such as calling method 
and calling 
         thread. Other contextual information that you may need to include in log 
files include
         user executing log statement, the network interface that the client component 
is listening 
-        to (ie 127.0.0.1 vs 192.168.1.1), hostname (especially important on 
multihomed boxen) or 
+        to (ie 127.0.0.1 vs 192.168.1.1), hostname (especially important on 
multihomed boxes) or 
         source of LogEvent (useful when writing a centralized log server).
       </p>
 
@@ -442,4 +443,4 @@
 
   </body>
   
-</document>
\ No newline at end of file
+</document>


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

Reply via email to