如果我错了,有人会纠正我,但是一个 ASP.NET 线程可以处理多个会话,因此您不能使用 Session_Start,因为它在会话开始时被调用一次。这意味着一旦其他用户访问该网站,您的 log4net.ThreadContext 可能会被新的用户信息覆盖。
您可以将以下代码放在 Application_AcquireRequestState 中,或者创建一个 HttpModule 并在 AcquireRequestState 方法中执行此操作。当 ASP.NET 运行时准备好获取当前 HTTP 请求的会话状态时,将调用 AcquireRequestState。如果您对获取用户名感兴趣,您可以在 AuthenticateRequest 中执行此操作,该操作在 ASP.NET 运行时准备好验证用户身份时(以及在 AcquireRequestState 之前)引发。
private void AcquireRequestState(Object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
log4net.ThreadContext.Properties["SessionId"] = context.Session.SessionID;
}
之后,您可以像这样设置 log4net.config(或在 web.config 中)。
<appender name="rollingFile"
type="log4net.Appender.RollingFileAppender,log4net" >
<param name="AppendToFile" value="false" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="yyyy.MM.dd" />
<param name="StaticLogFileName" value="true" />
<param name="File" value="log.txt" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern"
value="%property{SessionId} %d [%t] %-5p %c - %m%n" />
</layout>
</appender>
希望这可以帮助!