1

私はadonetアペンダーを持っていて、追加の列を定義しました。asp.netセッションからuserIdを取得し、ログに記録したいと思います。

このページによると、私が次のように使用する%aspnet-session{key}パターンがあります。

<parameter>
    <parameterName value="@userId" />
    <dbType value="String" />
    <size value="255" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%aspnet-session{current_member}" />
    </layout>
  </parameter>

そして私はデータベースで次の結果を得ました:

/ LM / W3SVC / 1 / ROOT / trunk-1-129718741958458380spnet-session {current_member}

私がここで間違っていることは何ですか?

4

4 に答える 4

4

log4net バージョン 1.2.11.0 以降、ASP.NETパターン レイアウトコンバーターの%aspnet-request{ASP.NET_SessionId}を次のように使用できます。

<conversionPattern value="%date %level %logger [%aspnet-request{ASP.NET_SessionId}] - %message%newline" />

リリース ノートを参照してください。

  • [LOG4NET-87] - ASP.Net 関連の PatternConverters をサポートして、HttpContext.Current.Session、Cache、Request などからのアイテムをキャプチャできるようにします。
于 2013-02-10T06:19:55.350 に答える
3

/LM/W3SVC/1/ROOT/trunk-1-129718741958458380spnet-session{current_member} がログに記録されています。これは、log4net 定義に次のようなものがあるためです。

<parameter>
        <parameterName value="@user" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%aspnet-session{current_memeber}" />
        </layout>
      </parameter>

log4net は "%aspnet-session{current_memeber}" から "%a" を取り出しており、アプリケーション ドメインが必要だと考えています。%a は、アプリケーション ドメインに変換される log4net パターンです。これは本当に面倒で、最近これに遭遇しましたが、回避方法がわかりません。

ここを参照してください: https://logging.apache.org/log4net/log4net-1.2.13/release/sdk/log4net.Layout.PatternLayout.html

この問題の解決策を見つけました。log4net 1.2.11 以降を使用している場合、このようにパラメータを宣言するとうまくいくはずです。

<parameter>
        <parameterName value="@session" />
        <dbType value="String" />
        <size value="2147483647"/>
        <layout type="log4net.Layout.PatternLayout">
          <converter>
            <name value ="AspNetSessionPatternConverter"/>
            <type value="log4net.Layout.Pattern.AspNetSessionPatternConverter"/>
          </converter>
          <conversionPattern value="%aspnet-session{gwsession}" />
        </layout>
      </parameter>

%a が appdomain に短絡していることがバグなのか、それとも aspnetsessionpatternconverter でこのようにパラメータを宣言する必要があるのか​​ はわかりませんが、log4net のドキュメントが更新されているとよいでしょう。これが他の誰かに役立つことを願っています。

于 2012-08-03T19:10:29.503 に答える
0

問題の解決策を見つけました。

私は自分のニーズを満たすためにそれをリファクタリングしました:

public class Log4NetAspNetProperty
    {
        private const string PropertyNamePrefix = "log4net_app_";
        private const string PropertyDefaultValue = null;

        private readonly string propertyName;
        private readonly object propertyValue;

        public string Name { get { return propertyName; } }

        private Log4NetAspNetProperty(string propertyName, object propertyValue)
        {
            if (String.IsNullOrWhiteSpace(propertyName)) throw new ArgumentNullException("propertyName");

            this.propertyName = propertyName;
            this.propertyValue = propertyValue;

            if (HttpContext.Current != null)
                HttpContext.Current.Items[GetPrefixedPropertyName()] = propertyValue;
        }

        public override string ToString()
        {
            if (HttpContext.Current == null)
                return PropertyDefaultValue;

            var item = HttpContext.Current.Items[GetPrefixedPropertyName()];
            return item != null ? item.ToString() : PropertyDefaultValue;
        }

        private static string GetPrefixedPropertyName()
        {
            return String.Format("{0}{1}", PropertyNamePrefix, PropertyDefaultValue);
        }

        public static void CurrentUserId(object userId)
        {
            var property = new Log4NetAspNetProperty("CurrentUserId", userId);
            log4net.ThreadContext.Properties[property.Name] = property;
        }

        public static void CurrentUrl(object url)
        {
            var property = new Log4NetAspNetProperty("CurrentUrl", url);
            log4net.ThreadContext.Properties[property.Name] = property;
        }
    }
于 2012-05-28T16:21:18.307 に答える
0

ASP.NET パターン コンバーターにアクセスするには、log4net 1.2.11 以降を使用する必要があります。

古いバージョンの log4net を使用すると、LM/W3SVC/1/ROOT/trunk-1-129718741958458380spnet-session{current_member} メッセージが表示されます。

于 2012-12-19T06:01:22.283 に答える