logging-log4net-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From George Chung <geo...@glympse.com>
Subject Re: Proposed bug fix for AspNetRequestPatternConverter.Convert()
Date Fri, 30 Mar 2012 20:59:31 GMT
The subtlety is that in Application_Startup(), httpContext is indeed not
null and httpContext.Request is really httpContext.get_Request().

And it is the act of calling get_Request() that throws the HttpException.

On Fri, Mar 30, 2012 at 1:51 PM, Johnson, Thomas
<Thomas.Johnson@lpsvcs.com>wrote:

> Sorry: if (httpContext != null && httpContext.Request != null)****
>
> ** **
>
> Since you’re in c# the second statement won’t be evaluated if the first is
> false and you will avoid NRE****
>
> ** **
>
> *From:* Johnson, Thomas
> *Sent:* Friday, March 30, 2012 2:50 PM
> *To:* log4net-dev@logging.apache.org
> *Subject:* RE: Proposed bug fix for
> AspNetRequestPatternConverter.Convert()****
>
> ** **
>
> Typically you want to avoid code like this // maybe just do:  if (httpContext != null)
{ //the entirety of your method } else writer.Write(SystemInfo.NotAvailableText);****
>
> ** **
>
>             try****
>
>             {****
>
>                 request = httpContext.Request;****
>
>                 if (request == null)****
>
>                     requestExists = false;****
>
>             }****
>
>             catch (System.Web.HttpException)****
>
>             {****
>
>                 requestExists = false;****
>
>             }****
>
> ** **
>
> ** **
>
> *From:* George Chung [mailto:george@glympse.com]
> *Sent:* Friday, March 30, 2012 1:29 PM
> *To:* log4net-dev@logging.apache.org
> *Subject:* Proposed bug fix for AspNetRequestPatternConverter.Convert()***
> *
>
> ** **
>
> Hello,****
>
> I'm new to this mailing list. Sorry if this is not the appropriate way to
> report a bug fix. Dereferencing HttpContext.Request will throw an exception
> if you call it in an Asp.net application's Application_Start().****
>
> ** **
>
> Thus, if you have log4net logging *and* you use a pattern layout format
> like %aspnet-request{REMOTE_ADDR} *and* you call Log4net inside
> Application_Start(), Log4net will throw an exception trying to log the
> message. The stack will look like this:****
>
> ** **
>
> log4net:ERROR [RollingFileAppender] ErrorCode: GenericFailure. Failed in
> DoAppend****
>
> System.Web.HttpException (0x80004005): Request is not available in this
> context****
>
>    at System.Web.HttpContext.get_Request()****
>
>    at
> log4net.Layout.Pattern.AspNetRequestPatternConverter.Convert(TextWriter
> writer, LoggingEvent loggingEvent, HttpContext httpContext)****
>
>    at
> log4net.Layout.Pattern.AspNetPatternLayoutConverter.Convert(TextWriter
> writer, LoggingEvent loggingEvent)****
>
>    at log4net.Layout.Pattern.PatternLayoutConverter.Convert(TextWriter
> writer, Object state)****
>
>    at log4net.Util.PatternConverter.Format(TextWriter writer, Object state)
> ****
>
>    at log4net.Layout.PatternLayout.Format(TextWriter writer, LoggingEvent
> loggingEvent)****
>
>    at log4net.Layout.Layout2RawLayoutAdapter.Format(LoggingEvent
> loggingEvent)****
>
> ** **
>
> ** **
>
> Here is my proposed fix:****
>
> ** **
>
> ** **
>
> internal sealed class AspNetRequestPatternConverter : AspNetPatternLayoutConverter****
>
>     {****
>
>         /// <summary>****
>
>         /// Write the ASP.Net Cache item to the output****
>
>         /// </summary>****
>
>         /// <param name="writer"><see cref="TextWriter" /> that will receive
the formatted result.</param>****
>
>         /// <param name="loggingEvent">The <see cref="LoggingEvent" /> on
which the pattern converter should be executed.</param>****
>
>         /// <param name="httpContext">The <see cref="HttpContext" /> under
which the ASP.Net request is running.</param>****
>
>         /// <remarks>****
>
>         /// <para>****
>
>         /// Writes out the value of a named property. The property name****
>
>         /// should be set in the <see cref="log4net.Util.PatternConverter.Option"/>****
>
>         /// property.****
>
>         /// </para>****
>
>         /// </remarks>****
>
>         protected override void Convert(TextWriter writer, LoggingEvent loggingEvent,
HttpContext httpContext)****
>
>         {****
>
>             bool requestExists = true;****
>
>  ****
>
>             HttpRequest request = null;****
>
>             try****
>
>             {****
>
>                 request = httpContext.Request;****
>
>                 if (request == null)****
>
>                     requestExists = false;****
>
>             }****
>
>             catch (System.Web.HttpException)****
>
>             {****
>
>                 requestExists = false;****
>
>             }****
>
>  ****
>
>             if (requestExists)****
>
>             {****
>
>                 if (Option != null)****
>
>                 {****
>
>                     WriteObject(writer, loggingEvent.Repository, request.Params[Option]);****
>
>                 }****
>
>                 else****
>
>                 {****
>
>                     WriteObject(writer, loggingEvent.Repository, request.Params);****
>
>                 }****
>
>             }****
>
>             else****
>
>             {****
>
>                 writer.Write(SystemInfo.NotAvailableText);****
>
>             }****
>
>         }****
>
>     }****
>
> The information contained in this message is proprietary and/or
> confidential. If you are not the intended recipient, please: (i) delete the
> message and all copies; (ii) do not disclose, distribute or use the message
> in any manner; and (iii) notify the sender immediately. In addition, please
> be aware that any message addressed to our domain is subject to archiving
> and review by persons other than the intended recipient. Thank you.
>

Mime
View raw message