Можно ли создать настраиваемый 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>