Pergunta

Eu tenho um aplicativo em camadas em Java que tem uma camada de acesso a dados fio de multi que é invocado a partir de diferentes pontos. A única chamada para esta camada é provável que gere vários tópicos para paralelizar pedidos para o DB.

O que eu estou procurando é uma ferramenta de medição que permita-me a definir "atividades" que são compostas por vários segmentos. Por conseguinte, o mesmo método na camada de acesso de dados deve log saídas diferentes dependendo do seu chamador. A capacidade de agrupar diferentes saídas para resumir o custo total da operação também é importante.

Embora a aplicação é em Java, a linguagem não é uma restrição; o que eu preciso são as diretrizes de design de modo que, eventualmente, implementá-lo. No momento, estamos usando log4j, mas não é possível obter esse comportamento dela.

Foi útil?

Solução

Você também deve ter um olhar para o aninhada recurso contexto de diagnóstico de log4j. Empurrando diferentes contextos para o logger para chamadores diferentes pode fazer o truque para você.

Outras dicas

Você deve ser capaz de passar por um logger ao redor, para que você criar um logger com base em algumas "comum" para os dados de tarefas - ou seja, nome de usuário, etc. Em seguida, passar este logger como parâmetro para todos os métodos que você precisa. Dessa forma, você será capaz de definir diferentes filtros e / ou regras em seu arquivo de configuração log4j. Ou para raspar o arquivo de saída com base no nome logger.

EDIT: Verifique também as classes do MDC e do NDC em log4j. Você pode adicionar há dados de contexto.

Em log4j você pode registrar o nome da linha com a "% t" padrão. Consulte log4j Padrão de layout .

Em uma das minhas aplicações (web), eu uso um logger ThreadLocal que captura informações de log em um StringBuilder. O objeto logger é inicializado no HttpServlet # método de serviço, se um parâmetro de rastreamento é definido (se não for definida, existe um nulo-logger muito rápido). A saída resultante é despejado como um comentário HTML na página requerente, ou gravados em um arquivo de log em um segmento.

Em Java5 (e posterior) você pode chamar

StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();

Verifique se o rastreamento de pilha para qualquer profundidade que você quer e log em conformidade.

Em Java 1.4 você pode obter a mesma informação com

StackTraceElement[] stackTrace = new Exception().getStackTrace();

Você deseja objetos logger associados com tópicos que eu penso. Uma variável ThreadLocal segurando uma instância log4j logger para cada ajuda segmento pode:

http://java.sun.com /javase/6/docs/api/java/lang/ThreadLocal.html

Você vai precisar passar alguma estrutura para a camada de acesso a dados que identifica a "atividade" atual. Você já deve ter um de classe "Atividade" que faz sentido, você pode usar um Logger de instância como Sunny sugeriu ou você pode usar uma terceira estrutura para acompanhar a atividade ao contexto.

Em qualquer caso, uma vez que a sua "atividade" é processado em vários tópicos que você não pode usar segmento local-armazenamento para manter o controle da "atividade" atual, como a maioria das outras respostas atuais sugerem. Você terá que passar por ai explicitamente.

Eu sugeriria fazer uma pequena fachada em cima de log4j que se expande a interface com métodos como

void debug(Activity activity, String message);

e passando a actividade de contexto para este a partir da camada de acesso a dados.

Você vai precisar fazer alguma modificação para a camada de acesso a dados para permitir que você passe a atividade atual a ele, mas a melhor forma de fazer isso depende fortemente da interface atual. Se você usar o Workspace-padrão, você só precisa adicionar um método setActivity () na área de trabalho de classe, mas outra interface-padrão pode exigir que você adicione um parâmetro de atividades para todos os métodos.

Se você por algum motivo não pode ou não mudar a camada de acesso a dados, você pode, naturalmente, armazenar a atividade de contexto no segmento local de armazenamento de antes de invocar a camada de acesso a dados e recuperá-lo apenas antes da desova dos sub-tópicos ou Enqueing os postos de trabalho na camada de acesso a dados. Essa é uma solução viável, mas é um pouco perigoso para passar informações em torno dessa forma.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top