Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I include SessionID in log files using log4net in ASP.NET?

Tags:

I'm new to log4net, so hopefully this is a really easy question for someone?!

I've got log4net working with the RollingLogFileAppender for my web application. I'm using logging to try and find where some performance issues are coming from. In order to do this, it'd be useful to include the ASP.NET SessionID in the log output so that I can make sure I'm looking at log entries for a specific user.

Is there any way I can do this through the conversionPattern setting for the appender? Is there a %property{??} setting I can use?

UPDATE: This question still hasn't been answered - does anybody have any ideas?

like image 709
Chris Roberts Avatar asked Dec 12 '08 10:12

Chris Roberts


2 Answers

Alexander K. is nearly correct. The only problem with it is that the PostAcquireRequestState event also occurs for static requests. A call to Session in this situation will cause a HttpException.

Therefore the correct solution becomes:

protected void Application_PostAcquireRequestState(object sender, EventArgs e) {     if (Context.Handler is IRequiresSessionState)     {         log4net.ThreadContext.Properties["SessionId"] = Session.SessionID;     } } 
like image 71
Dan Turner Avatar answered Sep 16 '22 12:09

Dan Turner


UPDATE (2014-06-12): Starting from log4net 1.2.11 you can use %aspnet-request{ASP.NET_SessionId} in conversion pattern for this purpose.

References: https://issues.apache.org/jira/browse/LOG4NET-87 http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html


You should create Application_PostAcquireRequestState handler in Global.asax.cs (it is called in every request):

protected void Application_PostAcquireRequestState(object sender, EventArgs e) {     log4net.ThreadContext.Properties["SessionID"] = Session.SessionID; } 

And add [%property{SessionID}] to conversionPattern.

like image 26
Alexander K. Avatar answered Sep 17 '22 12:09

Alexander K.