Applied - tah!

On Thu, 5 Jun 2003 04:48 pm, Anton Tagunov wrote:
> 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.ja
>va avalon-logkit/src/java/org/apache/log/output/ServletOutputLogTarget.java
> ---
> avalon-logkit.orig/src/java/org/apache/log/output/ServletOutputLogTarget.ja
>va       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]

-- 
Cheers,

Peter Donald
---------------------------------------------------
Murphy's law - "Anything that can go wrong, will." 
(Actually, this is Finagle's law, which in itself 
shows that Finagle was right.)
---------------------------------------------------


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

Reply via email to