24

私はlog4netを初めて使用するので、これが誰かにとって本当に簡単な質問になることを願っています。

log4netがWebアプリケーションのRollingLogFileAppenderで動作しています。ロギングを使用して、パフォーマンスの問題がどこから来ているのかを調べています。これを行うには、ログ出力にASP.NET SessionIDを含めて、特定のユーザーのログエントリを確認できるようにすると便利です。

conversionPatternアペンダーの設定でこれを行う方法はありますか?使用できる設定はあり%property{??}ますか?

更新:この質問にはまだ回答がありません-誰かアイデアはありますか?

4

5 に答える 5

20

アレクサンダー K. はほぼ正しいです。唯一の問題はPostAcquireRequestState、静的リクエストでもイベントが発生することです。この状況で Session を呼び出すと、HttpException.

したがって、正しい解は次のようになります。

protected void Application_PostAcquireRequestState(object sender, EventArgs e)
{
    if (Context.Handler is IRequiresSessionState)
    {
        log4net.ThreadContext.Properties["SessionId"] = Session.SessionID;
    }
}
于 2011-03-16T05:08:45.967 に答える
16

更新(2014-06-12): log4net 1.2.11以降%aspnet-request{ASP.NET_SessionId}、この目的の変換パターンで使用できます。

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


Global.asax.csにApplication_PostAcquireRequestStateハンドラーを作成する必要があります(すべてのリクエストで呼び出されます)。

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

そして、[%property{SessionID}]をconvertingPatternに追加します。

于 2009-05-16T23:10:08.090 に答える
6

私もこれに対する答えを探していましたが、それ%aspnet-request{ASP.NET_SessionId}が私にとってうまくいくことがわかりました。

于 2012-06-11T07:02:07.357 に答える
5

私が間違っていたら誰かが私を訂正しますが、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>

お役に立てれば!

于 2009-07-24T22:42:59.373 に答える
1

あなたが試すことができます:

<conversionPattern
    value="%date %-5level %logger ${COMPUTERNAME} [%property{SessionID}] - %message%newline" />

...あなたの Web.config と Global.asax.cs:

protected void Session_Start(object sender, EventArgs e)
{
    log4net.ThreadContext.Properties["SessionID"] = Session.SessionID;
    log4net.Config.XmlConfigurator.Configure();
}
于 2008-12-12T11:38:24.253 に答える