log4netpattern-layout

How to use aspnet-session pattern layout?


I have adonet appender and I defined additional column. I want to get the userId from the asp.net session and do log.

According to this page there is %aspnet-session{key} pattern which I use like this:

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

and I got the following result in the database:

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

What I am doing wrong here?


Solution

  • I found a solution to my problem.

    I just refactored it to serve my needs:

    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;
            }
        }