Как использовать шаблон шаблона aspnet-сессии? - PullRequest
1 голос
/ 24 января 2012

У меня есть apponet appender, и я определил дополнительный столбец.Я хочу получить userId из сеанса asp.net и сделать журнал.

Согласно этой странице существует шаблон% 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 голосов
/ 10 февраля 2013

Начиная с версии log.11net 1.2.11.0, вы можете использовать % aspnet-request {ASP.NET_SessionId} преобразователя шаблонов ASP.NET следующим образом:

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

См. Примечания к выпуску :

  • [LOG4NET-87] - Поддержка связанных с ASP.Net PatternConverters для разрешения элементов из HttpContext.Current.Session, Cache, Request и т. Д. Для захвата.
2 голосов
/ 03 августа 2012

/ 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 принимает"% a" из "% aspnet-session {current_memeber}" и думает, что вы хотите домен приложения.% 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 коротким замыканием в домене приложения ошибкой или вы должны объявитьваши параметры похожи на это с помощью aspnetsessionpatternconverter, но было бы неплохо, если бы документация log4net была обновлена.Надеюсь, это поможет кому-то еще.

0 голосов
/ 19 декабря 2012

Вам необходимо использовать log4net 1.2.11 или выше, чтобы получить доступ к конвертерам шаблонов ASP.NET.

Вы получите сообщение LM / W3SVC / 1 / ROOT / trunk-1-129718741958458380spnet-session {current_member} при использовании более старой версии log4net.

0 голосов
/ 28 мая 2012

Я нашел решение своей проблемы.

Я просто переработал его, чтобы удовлетворить свои потребности:

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