Я новичок в log4net, и я не могу найти четких примеров того, как справиться с этой ситуацией.
У меня есть стек связи, который состоит из трех уровней: аппаратного обеспечения, транспорта и протокола. Три слоя содержатся внутри класса менеджера. Что касается пользователя кода, он создает менеджера с аппаратным типом (Serial, Ethernet, SSL и т.д.) И предоставляет адрес. Может быть несколько экземпляров менеджера, каждый из которых подключается к другой цели.
Я хотел бы, чтобы мой вывод дал контекст того, из какого соединения было получено конкретное сообщение (127.0.0.1 или COM5 и т.д.). ThreadContext не очень полезен, потому что менеджер может быть вызван из любого потока, и каждый слой работает в своем потоке.
Есть ли способ установить контекст на основе конкретного экземпляра объекта? Или есть лучший способ обработки выходного форматирования?
Вы должны использовать перегрузку LogManager.GetLogger()
, которая принимает string name
, таким образом вы можете передать почти что угодно, как имя журнала.
Способ добавления дополнительного контекста для сообщений - это не только запись строкового сообщения, но и создание собственного объекта сообщения, содержащего как информацию журнала, так и тип оборудования подключения (и любую дополнительную информацию, которую вы хотели бы включить).
Здесь вы можете найти пример .
Другим вариантом может быть использование контекста вложенной диагностики:
using(NDC.Push("<Connection type>"))
{
// perform your logging here
}
Данные NDC будут включены в сообщение и могут выводиться с помощью шаблона% ndc. Тем не менее, примечание о предупреждении, NDC будет включено в ЛЮБЫЕ сообщения, регистрируемые в пределах его области использования, что, возможно, связано с тем, что вы рассмотрели бы маршрут пользовательских сообщений.