1

我有adonet appender,我定义了附加列。我想从 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

您需要使用 log4net 1.2.11 或更高版本才能访问 ASP.NET 模式转换器。

当您使用旧版本的 log4net 时,您将收到 LM/W3SVC/1/ROOT/trunk-1-129718741958458380spnet-session{current_member} 消息。

于 2012-12-19T06:01:22.283 回答