Пользовательское свойство log4net PatternLayoutConverter (с индексом)

Можно ли создать настраиваемый PatternLayoutConverter log4net, который позволяет "индексировать" значение, которое нужно настроить? Я знаю о строке преобразования "свойства", которая позволяет вам писать такой код:

ThreadContext.Properties["ID"] = yourID;

И указать вот так:

%property{ID} 

Это значение должно быть включено в вывод.

Что, если значения, которые я хочу зарегистрировать есть в каком-то другом "словаре"? Я полагаю, что мог бы написать некоторую логику для копирования этих значений из словаря в один из контекстов log4net, а затем просто использовать встроенный токен свойства % . Что, если я хочу, чтобы log4net регистрировал значения непосредственно из моего собственного "словаря" на основе значения индекса, указанного в файле конфигурации?

Могу ли я написать свой собственный PatternLayoutConverter, который позволил бы мне настроить что-то вроде этого:

%myproperty{ID}

И затем вытащить соответствующее значение «ID» из моего «словаря»?

Для всех, кому интересно,

[РЕДАКТИРОВАТЬ] Я получил ответ, который хотел. Я включил сюда код моего образца PatternLayoutRenderer. В моем тесте у меня есть статический словарь в моем классе основной формы, где я мог бы хранить «настройки приложения». Я создал PatternLayoutConverter, который может принимать ключ в качестве параметра, чтобы конвертер мог найти правильное значение в словаре. Я мог бы достичь той же функциональности, используя объекты контекста log4net (или NLog), но в нашем приложении у нас могут быть некоторые настройки или информация о сеансе, которые приложение будет хранить для других целей, и мы хотим иметь возможность добавлять это в вывод журнала. Поскольку он уже будет в структуре поиска, было бы неплохо иметь возможность ссылаться на данные напрямую, а не явно копировать их в log4net (или контекст NLog).

В любом случае, вот код:

namespace Log4NetTest
{
  class KeyLookupPatternConverter : PatternLayoutConverter
  {
    protected override void Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent)
    {
      //Use the value in Option as a key into the "application settings" stored on the main form.
      string setting;
      if (Form1.AppSettings.TryGetValue(Option, out setting))
      {
        writer.Write(setting);
      }
    }
  }
}

Конфигурация макета:

  //Log the "sessionid" and "userid" values from our "application settings" object
  <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%d [%t] %-5p [session = %KLPC{sessionid}] [user = %KLPC{userid}] %m%n"/>
    <converter>
      <name value="KLPC" />
      <type value="Log4NetTest.KeyLookupPatternConverter" />
    </converter>
  </layout>
5
задан wageoghe 19 October 2010 в 14:11
поделиться