|
RE: Logging in a Web App (Threads, Sessions and Requests): msg#00036log.log4net.user
Oh, I get it now! The "MyAuthenticateRequest" name woke me up. Thanks! A question: what happens in the following situation: There are two requests on the same thread. Request1 starts log4net.MDC.Set("sessionID", mContext.Session().SessionID) is called in my HttpModule Some logging for Request1 occurs Request2 starts log4net.MDC.Set("sessionID", mContext.Session().SessionID) is called in my HttpModule Some logging for Request2 occurs Some logging for Request1 occurs Request1 ends Request2 ends Once that second MDC.Set is called, won't all of my logging for Request1 be written with Request2's sessionID? Since a web app is multi-threaded, I cannot guarantee that Request1 will finish before Request2 application, can I? -----Original Message----- From: Ron Grabowski [mailto:rongrabowski@xxxxxxxxx] Sent: Thursday, February 10, 2005 10:23 AM To: log4net-user@xxxxxxxxxxxxxxxxxx Subject: RE: Logging in a Web App (Threads, Sessions and Requests) I think is it: Imports System.Web Public Class Log4NetHttpModule Implements IHttpModule Public Sub Init(ByVal app As HttpApplication) _ Implements IHttpModule.Init AddHandler app.AuthenticateRequest, _ AddressOf MyAuthenticateRequest End Sub Public Sub Dispose() Implements IHttpModule.Dispose ' add clean-up code here if required End Sub Public Sub MyAuthenticateRequest(ByVal s As Object, _ ByVal e As EventArgs) Dim app As HttpApplication app = CType(s, HttpApplication) If (app.Request.IsAuthenticated = True) Then log4net.MDC.Set("UserIdentityName", app.User.Identity.Name) Else log4net.MDC.Set("UserIdentityName", "N/A") End If End Sub End Class I took the skeleton for the class from here: http://www.devx.com/dotnet/Article/6962/0/page/4 - Ron --- "Hart, Leo" <Leo.Hart@xxxxxxx> wrote: > I am going to try what you have suggested, although I currently know > nothing about HttpModules (looks like I need to do some reading). > > One question (though I'm ashamed I need to ask): > > What's the VB.NET equivalent of > > public void Init(System.Web.HttpApplication context) > { > context.AuthorizeRequest += new > EventHandler(context_AuthorizeRequest); > } > > I tried: > > Public Sub Init(ByVal context As System.Web.HttpApplication) > AddHandler context.AuthenticateRequest, AddressOf > context.AuthorizeRequest > End Sub > > But it didn't like that, saying "'AddressOf' operand must be the name > of a method; no parentheses are needed." > > > Thanks, > Leo > > > -----Original Message----- > From: Ron Grabowski [mailto:rongrabowski@xxxxxxxxx] > Sent: Thursday, February 10, 2005 9:46 AM > To: Log4NET User > Subject: Re: Logging in a Web App (Threads, Sessions and Requests) > > > Have you tried creating a HttpModule and populating the MDC that way? > There are lot of events you can subscribe to: > > http://www.eggheadcafe.com/articles/20030701.asp > > One way to do it might be this way: > > public class Log4NetHttpModule : System.Web.IHttpModule > { > public Log4NetHttpModule() > { > > } > > public void Init(System.Web.HttpApplication context) > { > context.AuthorizeRequest += new > EventHandler(context_AuthorizeRequest); > } > > private void context_AuthorizeRequest(object sender, EventArgs e) { > HttpApplication context = (HttpApplication)sender; > > if (context.Request.IsAuthenticated == true) > { > log4net.MDC.Set("UserIdentityName", context.User.Identity.Name); > } > else > { > log4net.MDC.Set("UserIdentityName", "N/A"); > } > } > > public void Dispose() > { > > } > > Make sure to add this to your web.config: > > <httpModules> > <add type="Foo.HttpModules.Log4NetHttpModule, Foo" > name="Log4NetHttpModule" /> </httpModules> > > inside of <system.web> > > Here is the conversion pattern: > > "%5p %d{yyyy-MM-dd hh:mm:ss tt} (%c:%L) - [%X{UserIdentityName}] %m%n" > > I think NLog supports things like > ${aspnet-session:variable=MyVariableName} directly in its conversion > patterns so you wouldn't have to mess with the HttpModule. > > - Ron > > --- "Hart, Leo" <Leo.Hart@xxxxxxx> wrote: > > > I have a Log4Net problem/situation that I'm sure many of you have > come > > across and have (hopefully) overcome. I scoured the 'net for an > > answer but wasn't able to find exactly what I needed. > > > > I'm starting to use Log4Net in my web application and I'm quite > > pleased with it overall. I was a user of Log4J when I was > programming > > > J2EE apps, so obviously Log4Net is a comfortable fit. > > > > I've embedded log statements throughout the various tiers of my > > enterprise app and it's outputting useful information to my rolling > > > log file just fine. The problem is when the app leaves my > development > > machine and moves to a production server with multiple users > hitting > > it > > at once. At that point it becomes very difficult to identify which > > log entries pertain to which users. > > > > So obviously I want to embed the session ID and/or the request ID > in > > my log entry. The first thing that came to mind was to simply log > the > > session/request IDs in the Page_Load/Page_Unload event, but that > > doesn't work because the other log entries that occur in between > > Page_Load and > > Page_Unload won't have that info. > > > > The next thing that came to mind was MDC/NDC. The problem with > that > > is that MDC/NDC seems to be thread-based and since a given IIS > server > > thread can support multiple sessions at once, the sessionID MDC can > > be overwritten. I realized this fact once I coded the following in > > my > > global.asax: > > > > > > Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs) > > ' Fires when the session is started > > > > log4net.MDC.Set("sessionID", Session.SessionID) > > > > m_log.Info("Session " & Session.SessionID & " is starting.") > > End Sub > > > > > > > > Sub Session_End(ByVal sender As Object, ByVal e As EventArgs) > > ' Fires when the session ends > > > > log4net.MDC.Remove("sessionID") > > > > m_log.Info("Session " & Session.SessionID & " has ended.") > > End Sub > > > > > > > > The last approach that came to mind was making the MDC.Set/Remove > > calls in my ASPX page in the Page_Load/Page_Unload events, but that > > > might not > > work either given that, once again, multiple sessions are in each > > thread. Things would get especially confusing if I turned on > logging > > in > > not only my presentation tier, but my business tier, my data tier > and > > any third party assemblies I'm utilizing. > > > > So what do I do? How do I solve this problem? CAN I solve this > > problem? > > > > > > Thanks for your time... > > Leo Hart > > > |
|
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| Previous by Date: | RE: Logging in a Web App (Threads, Sessions and Requests): 00036, Ron Grabowski |
|---|---|
| Next by Date: | RE: Logging in a Web App (Threads, Sessions and Requests): 00036, Ron Grabowski |
| Previous by Thread: | Dynamically changing connection string in XML config file.i: 00036, Diego Barros |
| Next by Thread: | RE: Logging in a Web App (Threads, Sessions and Requests): 00036, Ron Grabowski |
| Indexes: | [Date] [Thread] [Top] [All Lists] |
| News | FAQ | advertise |