Qual é a diferença entre log4net.ThreadContext e log4net.LogicalThreadContext?

ATUALIZADO em 18/11/2014 - Ao navegar no repositório de origem log4net, descobri que a implementação do LogicalThreadContext foi modificada em novembro de 2011 para armazenar suas propriedades usando CallContext.LogicalSetData (e obtê-las usando LogicalGetData). Isso é importante porque isso significa que LogicalThreadContext agora deve funcionar corretamente. Quaisquer dados armazenados no LogicalThreadContext devem ser "fluidos" para qualquer thread ou tarefa filho. Isso se compara ao ThreadContext (e à implementação antiga do LogicalThreadContext), onde os dados armazenados no contexto permanecem locais no segmento atual e NÃO fluem para os segmentos / tarefas filho.

Se você estiver interessado, aqui está a alteração:

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

Espero que alguém que esteja de acordo com essa pergunta antiga encontre essas informações úteis.

O log4net fornece dois objetos "contexto de encadeamento" diferentes:ThreadContext eLogicalThreadContext, cada um com uma bolsa de propriedades, Propriedades. ThreadContext tem umThreadContextProperties enquanto LogicalThreadContext possui umLogicalThreadContextProperties saco.

ThreadContext é talvez mais conhecido como "MDC". LogicalContext é talvez mais conhecido como "LDC". Usarei o nome abreviado para o restante deste post.

MDC.Properties é implementado usandoSystem.Threading.Thread.SetData enquanto LDC.Properties é implementado usando usandoSystem.Runtime.Remoting.Messaging.CallContext.SetData.

Para comparação, o NLog expõe apenas "MDC" (agora conhecido como MappedDiagnosticContext) para armazenar propriedades locais do encadeamento. A implementação do NLog usa System.Threading.Thread.SetData, portanto, sua implementação é igual à do log4net.

No log4net e no NLog, as propriedades "MDC" são armazenadas em um dicionário que é armazenado no armazenamento local do encadeamento.

Em um caso como esse, armazenar o dicionário em uma decoração de variável de membro da classe, com [ThreadStatic], seria equivalente?

[ThreadStatic]
private static IDictionary<string, string> threadProperties;

Qual é a declaração equivalente (ou similar) usando a nova classe ThreadLocal do .NET 4.0?

Por fim, qual é a diferença real e prática entre LDC e MDC? Mesmo depois de ler os tópicos do MSDN vinculados acima, não está claro para mim. Quando você realmente usaria um sobre o outro? Parece que a grande maioria das referências / exemplos que eu vejo para o log4net e o contexto é para o GDC (global - o que eu entendo), o NDC (aninhado - o que eu também entendo) e o MDC. A maioria das referências que posso encontrar no LDC (ou LogicalThreadContext) ao pesquisar no Google está relacionada a check-ins nos repositórios de código-fonte do log4net, e não no uso no mundo real. O LDC quase nunca aparece em perguntas ou exemplos.

Eu encontreiesta link que oferece algumas informações bastante boas sobre a diferença de um dos desenvolvedores do log4net, Nicko Cadell, mas ainda não está claro para mim.

Uma questão maior, não diretamente relacionada ao log4net, é qual é a diferença prática entre Thread.SetData e CallContext.SetData?

De acordo comCallContext Artigo do MSDN, os dados do CallContext podem ser propagados para outro AppDomain. Para ser propagado, um item de dados armazenado no CallContext deve expor oILogicalThreadAffinative interface. Portanto, essa parece ser uma diferença entre Thread.SetData e CallContext.

De acordo com o link Nicko Cadell, o log4net não implementa ILogicalThreadAffinative, portanto as propriedades do LDC não serão propagadas.

Talvez haja aqui o suficiente para que eu possa responder à minha própria pergunta, talvez não. Eu ainda estou trabalhando no entendimento.

Se você usa o log4net, todos usam MDC, LDC, ambos? Se você usa o MDC, é porque a maioria dos exemplos do "mundo real" parece usá-lo? Se você usa o LDC, tem um motivo específico para usá-lo? Se você usa os dois, como escolhe quando usar quais?

Observe que vi alguns artigos sobre o MDC (e talvez o LDC) talvez não funcionem corretamente nos aplicativos ASP.net devido à alternância de threads. Não estou particularmente interessado nesse problema, pois não estou trabalhando no ASP.net.

Na verdade, eu encontrei algumas postagens úteis aqui no SO que podem contribuir para a discussão:

Quais são as práticas recomendadas para usar o armazenamento local de threads no .NET?

.Net: thread lógico e armazenamento local de threads?

Desde já, obrigado!

questionAnswers(1)

yourAnswerToTheQuestion