2

これはおそらく不可能ですが、機能させる方法があるかどうか疑問に思っています。

ログ ステートメントが既に組み込まれている大規模な ASP.NET MVC43 アプリケーションがあります。

ここで、各ログ エントリにセッション オブジェクトの「会社名」の値を含める必要があります。セッションデータを読み取ってログエントリに含めるようにlog4netを構成することは可能ですか? それとも何か強制的に...?

アイデアをありがとう。

[編集] この質問は大いに役立ちました: ASP.NET で log4net を使用して、ログ ファイルに SessionID を含めるにはどうすればよいですか?

私はこれを私の解決策として終わらせました:

Global.asax.cs で:

    // After the session is acquired, push the organization code into log4net's thread context, in case it has to log anything.
    protected void Application_PostAcquireRequestState(object sender, EventArgs e)
    {
        if (Context.Handler is IRequiresSessionState && Session != null && Session[Constants.EMPLOYEE_DETAILS] != null)
                log4net.ThreadContext.Properties["Company"] = ((EmployeeDetails)Session[Constants.EMPLOYEE_DETAILS]).Company;
    }

log4net 構成:

  <parameter>
    <parameterName value="@Company"/>
    <dbType value="String"/>
    <size value="10"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%property{Company}" />
    </layout>
  </parameter>

うまく機能します-ログ出力に会社名が表示されるようになりました。助けてくれてありがとう、みんな。

4

3 に答える 3

2

カスタムレイアウトコンバーターを使用する

public class CompanyLayoutConverter : PatternLayoutConverter
{
    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
    {
         var httpContext = HttpContext.Current;
         if (httpContext == null)
             return;

         writer.Write(httpContext.Session["Company Name"]);
    }
}

このコンバーターをアペンダーレイアウトに追加すると、会社名が出力に表示されます(単にconvertingPattern%company値で使用します)。

<appender name="RollingLogFileAppender" 
          type="log4net.Appender.RollingFileAppender">
  <threshold value="All" />
  <file value="C:\LogFile" />
  <appendToFile value="true" />
  <rollingStyle value="Date" />
  <datePattern value="'.'yyyyMMdd'.log.txt'" />
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <layout type="log4net.Layout.PatternLayout">
    <converter>
      <name value="company"/>
      <type value="Foo.Bar.CompanyLayoutConverter"/>
    </converter>
    <conversionPattern value="%date %-5level %logger - %company %message%newline" />
  </layout>
</appender>
于 2012-12-03T20:51:36.267 に答える
1

これを実装する方法については、この回答を参照してください。

log4net でユーザー名を取得する

独自の Appender を実装しなくても実行できるはずです。

PatternLayoutConverterからパラメータ化された値を取得するカスタムの例を次に示しますHttpContext.Current.Session。(リンクされた回答の一部として投稿したときにテストしたかどうかは覚えていませんが、近いはずです):

namespace Log4NetTest
{
  class HttpContextSessionPatternConverter : PatternLayoutConverter
  {
    protected override void Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent)
    {
      //Use the value in Option as a key into HttpContext.Current.Session
      string setting = "";

      HttpContext context = HttpContext.Current;
      if (context != null)
      {
        object sessionItem;
        sessionItem = context.Session[Option];
        if (sessionItem != null)
        {
          setting = sessionItem.ToString();
        }
        writer.Write(setting);
      }
    }
  }
}

別の簡単なアイデアは、次のようなことです...必要なセッションパラメーターを取得するオブジェクトを作成し、そのオブジェクトを MDC に配置してから、レイアウトで MDC を参照します。log4net が MDC からオブジェクトにアクセスすると、ToString メソッドを呼び出して、ログに書き込まれる値を取得します。

public class HttpContextSessionParametreProvider
{
  private string _name;
  private string _notSet;

  public HttpContextSessionParameterProvider(string name)
  {
    _name = name;
    _notSet = string.Format("{0} not set", _name);
  }

  public override string ToString()
  {
    HttpContext context = HttpContext.Current;  
    if (context != null && context.Session != null)
    {
      object item = context.Session[_name];
      if (item != null)
      {
        return item.ToString();
      }
    }
    return _notSet;
  }
}

プログラムのエントリ ポイントの近くのどこかで、次のように使用します。

MDC.Set("CompanyName", new HttpContextSessionParametreProvider("Company Name"));

(MDC からパラメーターをプルするように log4net を構成する方法の便利な例はありませんが、見つけるのは難しくありません)。

編集:

次のように PatternLayout を構成できます。

  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="[%thread]|[%property{CompanyName}]|%message%newline"/>
  </layout>

ここで、何かに設定されていると仮定するHttpContext.Session["Company Name"]と、メッセージをログに記録するたびに、値がログに書き込まれます。

于 2012-12-03T20:54:59.570 に答える
0

コンテキストとパターンレイアウトを使用してこれを行うことができると思います。

http://logging.apache.org/log4net/release/manual/contexts.html

http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html

ただし、ドキュメントはあまり役に立ちません。

于 2012-12-03T20:47:41.613 に答える