私が間違っていたら誰かが私を訂正しますが、1 つの ASP.NET スレッドは複数のセッションを処理できるため、セッションの開始時に 1 回呼び出されるので、Session_Start を使用することはできません。つまり、別のユーザーが Web サイトにアクセスするとすぐに、log4net.ThreadContext が新しいユーザー情報によって上書きされる可能性があります。
以下のコードを Application_AcquireRequestState に入れるか、HttpModule を作成して AcquireRequestState メソッドでそれを行うことができます。AcquireRequestState は、ASP.NET ランタイムが現在の HTTP 要求のセッション状態を取得する準備ができたときに呼び出されます。ユーザー名の取得に関心がある場合は、ASP.NET ランタイムがユーザーの ID を認証する準備ができたとき (および AcquireRequestState の前) に発生する AuthenticateRequest でそれを行うことができます。
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>
お役に立てれば!