Qual é a diferença entre o NDC de Log4j e as instalações do MDC

Para expandir no link Sikorski publicado nos comentários:

NDC

No NDC, o N significa aninhado , o que significa que se controla um único valor com uma Pilha. Se “empurrar” uma corda, depois pode “empurrar” outra quando o processamento lhe disser para o fazer; e quando o processamento estiver completo, pode abri-la para ver o valor anterior. Este tipo de registo contextual seria útil em alguns processos profundamente aninhados.

Definir a string de contexto

NDC.Push("processingLevel2"); log.info("success");

Isto irá obter resultados no seu registo onde tem o padrão %x (minúsculas):

log4j.appender.CA.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSSS} %p %C %x = %m%n

MDC

O M significa atribuído , e isto dá-lhe um tipo diferente de controlo. Em vez de utilizar uma única pilha para controlar uma única cadeia contextual, utiliza pares nome/valor. Isto é útil para rastrear múltiplos bits contextuais, tais como colocar o nome de utilizador e o IP no registo.

Definir os valores mapeados:

MDC.put("userIP", req.getRemoteAddr());MDC.put("userName", foo.getName());log.info("success");

Exemplo MD4 log4j pattern

Caixa X com cadeias de exemplo "userIP" E "userName". Estes devem corresponder no seu código e configuração log4j:

log4j.appender.CA.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSSS} %p %X{userIP} %C %X{userName} = %m%n

Eu combiná-los-ia numa) string de contexto *.

Semelhanças e diferenças

Em ambos os casos, cada vez que executar o log.info("success");, a saída terá o contexto adicional que forneceu. Isto é muito mais limpo do que concatenar cordas como log.info(req.getRemoteAddr()) + " success"); de cada vez que faz o login.

Por favor note que existem sérias diferenças entre os dois no que diz respeito a fios e recursos. Em particular, o NDC manterá identificadores para os seus threads que podem afectar a libertação de recursos se não for diligente no sentido de rebentar e limpar a pilha do NDC.

Da ligação: a utilização do NDC pode causar fugas de memória se não chamar periodicamente o NDC.remove() método.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *