используя log4net со свойствами области - PullRequest
0 голосов
/ 28 ноября 2018

Я использую в существующем приложении log4net с целью seq.Во время рабочего процесса кода (который вызывает различные методы) я хочу сохранить идентификатор как свойство, чтобы сохранить ссылку на этот идентификатор (при взгляде на Seq Проще понять, что произошло)

есть лиспособ использовать что-то как

using(var log = ........ properties)
{
     normal logging here
}

Спасибо

1 Ответ

0 голосов
/ 30 ноября 2018

Такое свойство может храниться в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...