В чем разница между log4net.ThreadContext и log4net.LogicalThreadContext?

ОБНОВЛЕНО 18.11.2014. При просмотре исходного репозитория log4net я обнаружил, что реализация LogicalThreadContext была изменена в Ноябрь 2011 г., когда он сохраняет свои свойства с помощью CallContext.LogicalSetData (и получает их с помощью LogicalGetData). Это важно, потому что это означает, что теперь LogicalThreadContext должен работать правильно. Любые данные, хранящиеся в LogicalThreadContext, должны передаваться в любые дочерние потоки или задачи. Это можно сравнить с ThreadContext (и старой реализацией LogicalThreadContext), где данные, хранящиеся в контексте, оставались бы локальными для текущего потока и НЕ передавались дочерним потокам / задачам.

Если вам интересно, вот изменение:

http: //svn.apache. org / viewvc / logging / log4net / trunk / src / log4net / Util / LogicalThreadContextProperties.cs? r1 = 1165341 & r2 = 1207948 & diff_format = h

Надеюсь, кто-нибудь, задавший этот старый вопрос, найдет эту информацию полезной.

log4net предоставляет два разных Объекты «контекста потока»: ThreadContext и LogicalThreadContext , каждый из которых имеет набор свойств, Properties. ThreadContext имеет мешок ThreadContextProperties , тогда как LogicalThreadContext имеет мешок LogicalThreadContextProperties .

ThreadContext, возможно, более широко известен как «MDC».

log4net предоставляет два разных объекта «контекста потока»: ThreadContext и LogicalThreadContext , каждый из которых имеет набор свойств, Properties. ThreadContext имеет мешок ThreadContextProperties , тогда как LogicalThreadContext имеет мешок LogicalThreadContextProperties .

ThreadContext, возможно, более широко известен как «MDC».

log4net предоставляет два разных объекта «контекста потока»: ThreadContext и LogicalThreadContext , каждый из которых имеет набор свойств, Properties. ThreadContext имеет мешок ThreadContextProperties , тогда как LogicalThreadContext имеет мешок LogicalThreadContextProperties .

ThreadContext, возможно, более широко известен как «MDC». LogicalContext, возможно, более известен как «LDC». Я буду использовать сокращенное название для остальной части этого сообщения.

MDC.Properties реализован с использованием System.Threading.Thread.SetData , а LDC.Properties реализован с использованием System.Runtime. Remoting.Messaging.CallContext.SetData .

Для сравнения, NLog предоставляет только «MDC» (теперь известный как MappedDiagnosticContext) для хранения локальных свойств потока. Реализация NLog использует System.Threading.Thread.SetData, поэтому его реализация такая же, как и в log4net.

И в log4net, и в NLog свойства «MDC» хранятся в словаре, который сам хранится в локальном хранилище потока.

В подобном случае было бы эквивалентным сохранение словаря в переменной-члене класса, обозначенной [ThreadStatic]?

[ThreadStatic]
private static IDictionary threadProperties;

Каким будет эквивалентное (или подобное) объявление с использованием .NET 4. 0 новый класс ThreadLocal?

В чем же, в конечном счете, практическая разница между LDC и MDC? Даже после прочтения упомянутых выше тем MSDN мне это непонятно. Когда бы вы действительно использовали одно вместо другого? Похоже, что подавляющее большинство ссылок / примеров, которые я вижу для log4net и контекста, относятся к GDC (глобальный - что я понимаю), NDC (вложенный - что я также понимаю) и MDC. Большинство ссылок, которые я могу найти на LDC (или LogicalThreadContext) при поиске в Google, связаны с проверками в репозиториях исходного кода log4net, а не с использованием в реальном мире. LDC почти никогда не встречается в вопросах или примерах.

Я нашел эту ссылку, которая предлагает довольно хорошую информацию о различиях от одного из разработчиков log4net, Нико Каделла, но все еще не ясно для меня.

Более крупный вопрос, не имеет прямого отношения к log4net, в чем практическая разница между Thread.SetData и CallContext.SetData?

Согласно статье CallContext MSDN, данные CallContext могут быть переданы в другой домен приложения. Для распространения элемент данных, хранящийся в CallContext, должен предоставлять интерфейс ILogicalThreadAffinative . Итак, похоже, это одно из различий между Thread.SetData и CallContext.

Согласно ссылке Нико Каделла, log4net не реализует ILogicalThreadAffinative, поэтому свойства LDC не будут распространяться.

Может быть, здесь достаточно того, что мне следует смогу ответить на свой вопрос, а может и нет. Я все еще работаю над пониманием.

Если вы используете log4net, каждый ли вы используете MDC, LDC, оба? Если вы используете MDC, это потому, что большая часть "реального мира" примеры вроде бы использовать? Если вы используете LDC, у вас есть конкретная причина для его использования? Если вы используете оба, как выбрать, когда использовать?

Обратите внимание, что я видел некоторые статьи, касающиеся MDC (и, возможно, LDC), возможно, не работают правильно в приложениях ASP.net из-за переключения потоков. Меня не особо интересует эта проблема, поскольку я не работаю в ASP.net.

На самом деле, я нашел здесь пару полезных сообщений о SO, которые могут способствовать обсуждению:

Каковы лучшие практики использования локальное хранилище потоков в .NET?

.Net: Логический поток и локальное хранилище потоков?

Заранее спасибо!

28
задан Community 23 May 2017 в 12:32
поделиться