Такое свойство может храниться в ThreadContext или LogicalThreadContext через, например,
log4net.ThreadContext.Properties["someId"] = "foo";
и может быть включено в LayoutPattern
через %property{someId}
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger | %level | %property{someId} | %message%newline" />
</layout>
Код ниже
ILog logger = LogManager.GetLogger("SomeLogger");
logger.Info("Message 1");
затем производит следующий вывод
SomeLogger | INFO | foo | Message 1
Эти контекстные данные могут быть сложены , потому чтоLog4net
имеет концепцию стеков контекста .
Стек хранится в свойстве контекста, поэтому стеки имеют имена, и в одном и том же контексте может существовать несколько стеков.Значение свойства, установленное в более узком контексте, переопределит стек с тем же именем свойства, установленным в более широком контексте.
Стек поддерживает методы Push и Pop.По мере того как в стек помещается больше контекстных данных, стек увеличивается.Когда отрисовывается стек, все данные, помещенные в стек, выводятся с самыми последними данными в правый конец строки.
Поскольку стек является просто объектом, хранящимся в свойствах контекста, он также отображаетсяиспользуя тот же синтаксис PatternLayout:% property {name}.Где name - это имя стека.
Вызывает методы Push и Pop стека, которые должны совпадать, чтобы каждый push-запрос имел соответствующий pop.Метод Push также возвращает объект IDisposable, который будет выполнять требуемую всплывающую операцию при его удалении.Это позволяет использовать C # синтаксис для автоматизации управления стеком.
Значение свойства устанавливается в стек через Push
, что возвращает объект IDisposable
, который удаляет этоЗначение свойства из стека при утилизации, например,
using (ThreadContext.Stacks["someId"].Push("bar"))
{
logger.Info("Message 2");
using (ThreadContext.Stacks["someId"].Push("baz"))
{
logger.Info("Message 3");
}
}
с выводом
SomeLogger | INFO | bar | Message 2
SomeLogger | INFO | baz | Message 3