Это поздно по сравнению с исходным вопросом и самым последним (принятым) ответом, но я опубликую его для будущих пользователей.
Согласно веб-сайту Common.Logging (NET) , следующая версия (текущая версия 2.0) должна иметь поддержку именно этой вещи. Однако неясно, когда планируется этот релиз. 2.0 был выпущен в апреле 2009 года. На сайте говорится, что следующий релиз запланирован на «июнь». Год не указан. Июнь 2009 и июнь 2010 пришли и ушли.
Сказав это, по крайней мере, реализация абстракции "context" log4net / NLog существует в репозитории исходного кода git проекта Castle. Запустите здесь и посмотрите на ExtendedLog4netLogger, GlobalContextProperties, ThreadContextProperties, ThreadContextStack и ThreadContextStacks, чтобы увидеть, как Castle предоставляет NDC и MDC. Аналогичная реализация существует в Castle для NLog.
Если бы Common.Logging for NET реализовывал подобную абстракцию, вы могли бы установить значения контекста через экземпляр регистратора, который вы возвращаете из LogManager, следующим образом:
ILog logger = LogManager.GetCurrentClassLogger();
logger.ThreadContextProperties["EventID"] = 123;
logger.GlobalContextPropeties["USER"] = GetUser();
В дополнение к этому, если у вас был определенный контекст, который вы хотите установить для всех сообщений журнала (скажем, из своего собственного контекста, который вы передаете в своем коде), вы можете написать свою собственную абстракцию log4net и / или NLog в подключитесь к Common.Logging, чтобы заполнить эту информацию автоматически. Например, предположим, что ваше приложение имеет «контекст», который передается, который помогает отслеживать информацию для данной «транзакции». Также, для простоты, предположим, что вы можете получить к нему доступ через статический класс, такой как «MyContext».
Ваш WriteInternal (то, что вы реализуете, когда пишете абстракцию логгера для подключения к Common.Logging), может выглядеть примерно так (это для NLog. Log4net может немного отличаться):
protected override void WriteInternal(CommonLoggingLogLevel logLevel, object message, Exception exception)
{
LogLevelNLog level = GetLevel(logLevel);
LogEventInfo logEvent = new LogEventInfo(level, _logger.Name, null, "{0}", new object[] { message }, exception);
//Access these context values for output formatting using the event-context:item token
logEvent.Context["ActivityID"] = MyContext.ActivityID;
logEvent.Context["SessionID"] = MyContext.SessionID;
logEvent.Context["TransactionStartTime"] = MyContext.TransactionStartTime;
//Note that you can also set NDC and/or MDC here:
NLog.MDC.Set("SoftwareVersion", MyContext.Version.ToString());
_logger.Log(declaringType, logEvent);
}
Если вы (или кто-то еще) используете Common.Logging (NET), необходимо предоставить свойства контекста log4net / NLog, вы можете сделать нечто подобное тому, что сделал Castle, чтобы показать их через интерфейс абстракции логирования. Если вы хотите установить контекст автоматически с информацией, которую вы можете получить из журнала вызовов, вы можете сделать что-то похожее на то, что я предлагаю выше.