Mudanças entre as edições de "RFWLogger"

De Wiki do Leitão
Ir para: navegação, pesquisa
 
(2 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 37: Linha 37:


=== Log de Exceções (logException) ===
=== Log de Exceções (logException) ===
O método `logException` permite registrar exceções que ocorrem no sistema. Ele converte a exceção em uma string detalhada, incluindo o stack trace, e a loga com a severidade apropriada. Se a exceção for do tipo [RFWValidationException] ou [RFWValidationGroupException], ela é registrada com a severidade `VALIDATION`.
O método `logException` permite registrar exceções que ocorrem no sistema. Ele converte a exceção em uma string detalhada, incluindo o stack trace, e a loga com a severidade apropriada. Se a exceção for do tipo '''[[RFWValidationException]]''' ou '''[[RFWValidationGroupException]]''', ela é registrada com a severidade `VALIDATION`.


<syntaxhighlight lang="java">
<syntaxhighlight lang="java">
Linha 229: Linha 229:


{{stop|Limitação de Uso Interno do RFWLogger|
{{stop|Limitação de Uso Interno do RFWLogger|
Um dos problemas do modelo atual do '''RFWLogger''' é que ele não pode ser utilizado diretamente nas classes que ele próprio utiliza, como nos métodos do [RFWInterceptor] e do [RFWDAO]. Isso ocorre porque, quando o '''RFWLogger''' tenta persistir os logs no banco de dados, ele gera novos logs sobre essa operação, resultando em um ciclo recursivo de persistência de logs.
Um dos problemas do modelo atual do '''RFWLogger''' é que ele não pode ser utilizado diretamente nas classes que ele próprio utiliza, como nos métodos do '''[[RFWInterceptor]]''' e do '''[[RFWDAO]]'''. Isso ocorre porque, quando o '''RFWLogger''' tenta persistir os logs no banco de dados, ele gera novos logs sobre essa operação, resultando em um ciclo recursivo de persistência de logs.


Por esse motivo, é recomendado que esses tipos de logs continuem sendo registrados pelo sistema de log em arquivo do servidor de aplicação, evitando o problema de recursão infinita.  
Por esse motivo, é recomendado que esses tipos de logs continuem sendo registrados pelo sistema de log em arquivo do servidor de aplicação, evitando o problema de recursão infinita.  


Uma solução potencial seria a criação de um DAO exclusivo para o '''RFWLogger''', o que eliminaria o problema ao utilizá-lo com o [RFWDAO]. No entanto, o problema relacionado ao `SessionManager#SMInterceptor` exigiria o desenvolvimento de uma fachada completa apenas para esse propósito. Embora essa solução seja viável, ela ainda não foi implementada. Para saber se o sistema está em modo de desenvolvimento, consulte a classe [RFW].
Uma solução potencial seria a criação de um DAO exclusivo para o '''RFWLogger''', o que eliminaria o problema ao utilizá-lo com o '''[[RFWDAO]]'''. No entanto, o problema relacionado ao `SessionManager#SMInterceptor` exigiria o desenvolvimento de uma fachada completa apenas para esse propósito. Embora essa solução seja viável, ela ainda não foi implementada. Para saber se o sistema está em modo de desenvolvimento, consulte a classe '''[[RFW]]'''.
}}
}}



Edição atual tal como às 01h46min de 4 de setembro de 2024

RFWLogger

Introdução

Visão Geral

O RFWLogger é um componente centralizado de logging para o sistema, projetado para gerenciar e registrar eventos, erros, e informações relevantes durante a execução do software. Ele abstrai os detalhes de implementação do processo de log, permitindo que diferentes partes do sistema registrem mensagens de maneira consistente e eficiente. Essa centralização facilita a manutenção, monitoramento e depuração, garantindo que todas as informações críticas sejam capturadas e armazenadas de forma estruturada.

Contexto de Uso

Em qualquer sistema complexo, o registro adequado de eventos é essencial para identificar problemas, entender o comportamento do software e realizar melhorias contínuas. O RFWLogger atende a essa necessidade, oferecendo uma interface uniforme para o registro de logs em diferentes níveis de severidade, como DEBUG, INFO, WARN, ERROR, e EXCEPTION. Ele é amplamente utilizado em todo o sistema para capturar desde mensagens de depuração até exceções críticas, possibilitando uma análise detalhada e rápida resolução de problemas. Além disso, o RFWLogger permite a customização da implementação de logging, adaptando-se às necessidades específicas de cada ambiente ou projeto.


Estrutura do Componente

Classes e Interfaces Envolvidas

O RFWLogger e a interface RFWLoggerImplementation são os componentes centrais do sistema de logging. A seguir, detalhamos o papel de cada um desses elementos:

Classe RFWLogger

A classe RFWLogger é responsável por centralizar todas as operações de log no sistema. Ela oferece métodos estáticos que permitem o registro de diferentes tipos de eventos, como erros, avisos, mensagens de depuração, e exceções. Essa classe utiliza uma implementação de RFWLoggerImplementation para realizar o log propriamente dito, o que significa que a lógica de logging pode ser customizada conforme necessário, sem alterar as chamadas de log em outras partes do sistema.

Interface RFWLoggerImplementation

A interface RFWLoggerImplementation define os métodos que uma implementação de logging deve fornecer. Ela inclui métodos para registrar logs com várias severidades (`DEBUG`, `INFO`, `WARN`, `ERROR`, `EXCEPTION`, etc.), bem como para logar exceções e objetos. A interface permite que diferentes implementações sejam utilizadas, dependendo dos requisitos específicos, como logar em um arquivo, banco de dados, ou serviço externo.

Relacionamento entre RFWLogger e RFWLoggerImplementation

A classe RFWLogger utiliza uma implementação de RFWLoggerImplementation para realizar o registro de logs. Por padrão, RFWLogger usa uma implementação interna simples, que imprime os logs no console. No entanto, essa implementação pode ser substituída dinamicamente utilizando o método `setImpl`, permitindo que o sistema de logging seja adaptado a diferentes ambientes ou necessidades. Esse design flexível permite que o processo de logging seja facilmente customizado, sem exigir mudanças no código que gera os logs.


Métodos da Classe RFWLogger

Log de Erros (logError)

O método `logError` é utilizado para registrar mensagens de erro com a maior prioridade. Ele pode ser chamado com uma simples mensagem ou com um conjunto de tags para categorizar o erro. Este método é essencial para capturar falhas que necessitam de atenção imediata.

RFWLogger.logError("Erro crítico ao processar a requisição");
RFWLogger.logError("Erro na conexão com o banco de dados", "CONEXAO", "BANCO_DE_DADOS");

Log de Exceções (logException)

O método `logException` permite registrar exceções que ocorrem no sistema. Ele converte a exceção em uma string detalhada, incluindo o stack trace, e a loga com a severidade apropriada. Se a exceção for do tipo RFWValidationException ou RFWValidationGroupException, ela é registrada com a severidade `VALIDATION`.

try {
    // código que pode lançar uma exceção
} catch (Exception e) {
    RFWLogger.logException(e);
}

Esse método também pode aceitar tags para categorizar a exceção:

RFWLogger.logException(e, "VALIDACAO", "ENTRADA_DE_DADOS");

Log de Avisos (logWarn)

O método `logWarn` é usado para registrar mensagens de aviso. Essas mensagens indicam potenciais problemas que não interrompem a execução, mas que podem necessitar de atenção. Assim como outros métodos, ele pode aceitar tags para categorizar os avisos.

RFWLogger.logWarn("Memória disponível baixa");
RFWLogger.logWarn("Uso de API obsoleta", "API", "DEPRECADO");

Log de Objetos (logObject)

O método `logObject` permite registrar o estado de um objeto. Ele utiliza o método `RUReflex.printObject` para gerar uma representação do objeto, que é então anexada ao log. Este método é útil para depuração, permitindo visualizar o conteúdo de objetos complexos.

MyObject obj = new MyObject();
RFWLogger.logObject("Estado do objeto", obj);

Log de Depuração (logDebug)

O método `logDebug` é utilizado para registrar mensagens de depuração. Essas mensagens são úteis durante o desenvolvimento e teste do sistema, permitindo acompanhar o fluxo de execução e o estado das variáveis.

RFWLogger.logDebug("Entrando no método processarPedido");

Log de Informações (logInfo)

O método `logInfo` é usado para registrar informações gerais sobre a operação do sistema. Essas mensagens não indicam erros ou problemas, mas são úteis para monitorar o comportamento normal do sistema.

RFWLogger.logInfo("Início do processamento de batch diário");

Log de Melhorias (logImprovement)

O método `logImprovement` é projetado para registrar sugestões de melhorias no código. Essas mensagens podem ser usadas para documentar áreas do código que podem ser otimizadas ou revisadas no futuro.

RFWLogger.logImprovement("Considerar uso de pool de conexões para otimizar desempenho");


Métodos da Interface RFWLoggerImplementation

Severidades do Log (RFWLogSeverity)

A interface RFWLoggerImplementation define uma enumeração interna chamada RFWLogSeverity, que especifica os diferentes níveis de severidade dos logs. Cada nível de severidade indica a importância ou o tipo de evento que está sendo registrado:

  • OBJECT: Usado para registrar o estado de objetos. Ideal para logs detalhados que imprimem a estrutura e valores de um objeto específico.
  • DEBUG: Indica mensagens de depuração. Essas mensagens são voltadas para desenvolvedores e são usadas durante o desenvolvimento e teste.
  • INFO: Usado para registrar informações gerais sobre o funcionamento do sistema, sem indicar erros ou problemas.
  • WARN: Indica avisos sobre potenciais problemas que não interrompem o funcionamento, mas que podem requerer atenção.
  • ERROR: Usado para registrar erros que afetam o funcionamento do sistema e que necessitam de intervenção.
  • DEV: Específico para mensagens voltadas aos desenvolvedores, como sugestões de melhorias ou notas sobre o código.
  • VALIDATION: Indica uma exceção relacionada a validação de dados ou regras de negócio.
  • EXCEPTION: Usado para registrar exceções que ocorrem durante a execução do sistema.

Implementação Padrão e Customização

A interface RFWLoggerImplementation define os métodos que uma implementação de logger deve fornecer. A implementação padrão usada pelo RFWLogger simplesmente imprime logs no console. No entanto, é possível criar implementações personalizadas para, por exemplo, gravar logs em arquivos, enviar logs para um sistema de monitoramento, banco de dados ou conforme necessário.

public class CustomFileLogger implements RFWLoggerImplementation {
    @Override
    public void log(RFWLogSeverity severity, String msg, String content, String exPoint, String... tags) {
        // Lógica para tratar o log conforme desejado.
    }
}

Para usar uma implementação personalizada, basta configurar o RFWLogger para utilizar a nova implementação:

RFWLogger.setImpl(new CustomFileLogger());

Exemplos de Implementações

Aqui estão alguns exemplos de como você pode implementar a interface RFWLoggerImplementation para diferentes cenários:

  • Logger para Arquivo: Uma implementação que grava os logs em arquivos locais, útil para auditoria ou diagnóstico offline.
  • Logger para Banco de Dados: Uma implementação que registra os logs em um banco de dados, permitindo consultas e análises posteriores.
  • Logger para Sistema de Monitoramento: Uma implementação que envia logs para um serviço de monitoramento em tempo real, como o ELK Stack ou Splunk.

Configuração e Extensibilidade

Como Substituir a Implementação Padrão

O RFWLogger permite que você substitua a implementação padrão de logging por uma personalizada, oferecendo flexibilidade para adaptar o sistema às suas necessidades específicas. Para substituir a implementação, utilize o método `setImpl` e forneça uma instância da nova implementação que segue a interface RFWLoggerImplementation.

Exemplo:

public class CustomFileLogger implements RFWLoggerImplementation {
    @Override
    public void log(RFWLogSeverity severity, String msg, String content, String exPoint, String... tags) {
        // Lógica para gravar o log em um arquivo
    }
}

// Substituindo a implementação padrão pelo CustomFileLogger
RFWLogger.setImpl(new CustomFileLogger());

Essa substituição pode ser feita em tempo de execução, permitindo que você adapte o comportamento do logger conforme o ambiente ou requisitos específicos.

Boas Práticas na Implementação de Logs

Aqui estão algumas recomendações para implementar logs de maneira eficaz:

  • Utilize Níveis de Severidade Apropriados: Escolha o nível de severidade que melhor se aplica ao evento sendo registrado. Use `DEBUG` para mensagens detalhadas de desenvolvimento, `INFO` para informações operacionais, `WARN` para potenciais problemas, `ERROR` para falhas críticas, e `EXCEPTION` para capturar exceções.
  • Evite o Uso Excessivo de Tags: As tags devem ser usadas para categorizar logs de forma a facilitar a filtragem e análise. Evite incluir informações que só aparecerão em um único evento, preferindo criar entradas específicas de `INFO` ou `DEBUG` para dados voláteis.
  • Mantenha Mensagens de Log Claras e Objetivas: Certifique-se de que as mensagens de log sejam claras e expliquem o contexto do evento registrado. Isso facilita a análise posterior e a compreensão dos logs por outros desenvolvedores.
  • Inclua Informações Relevantes: Sempre que possível, inclua informações adicionais, como o estado do sistema ou de objetos, para ajudar na depuração e análise de problemas.

Personalização do Comportamento do Logger

O RFWLogger é altamente configurável e pode ser adaptado para diferentes cenários:

  • Alteração Dinâmica da Implementação: Você pode trocar a implementação de logging em tempo de execução conforme necessário, o que é útil em ambientes de desenvolvimento e produção com diferentes requisitos de logging.
  • Integração com Sistemas de Monitoramento: Considerando a arquitetura modular do RFWLogger, é possível integrar o logger com sistemas de monitoramento externos, como Splunk, ELK Stack, ou outras ferramentas de observabilidade. Isso pode ser feito implementando uma nova versão da interface RFWLoggerImplementation que envia os logs para esses serviços.
  • Customização de Formatos de Log: Dependendo da implementação escolhida, você pode personalizar o formato das mensagens de log para incluir timestamps, IDs de correlação, ou outras metainformações relevantes para a análise e rastreamento de problemas.

Exemplos Práticos

Cenários Comuns de Uso

Nesta seção, apresentamos exemplos de como o RFWLogger pode ser utilizado em situações reais do sistema, ajudando a entender melhor a aplicação prática dos métodos de logging.

Exemplo 1: Registro de Erros Críticos

try {
    // Código que pode lançar uma exceção
} catch (Exception e) {
    RFWLogger.logError("Erro ao processar a transação", "TRANSAÇÃO", "ERRO");
    RFWLogger.logException(e);
}

Neste exemplo, um erro crítico durante o processamento de uma transação é registrado, juntamente com a exceção detalhada que causou o erro.

Exemplo 2: Registro de Avisos de Baixa Severidade

if (memoriaDisponivel < LIMITE_MINIMO) {
    RFWLogger.logWarn("Memória disponível abaixo do limite recomendado", "MEMÓRIA", "RECURSOS");
}

Aqui, um aviso é registrado quando a memória disponível cai abaixo de um limite seguro. Isso permite monitorar a saúde do sistema e tomar ações preventivas.

Exemplo 3: Registro de Informações Gerais

RFWLogger.logInfo("Início do processamento de pedidos noturnos");

Este exemplo demonstra o uso do log de informações para registrar eventos normais do sistema, como o início de um processamento em lote.

Exemplo 4: Logando o Estado de um Objeto para Depuração

Pedido pedido = new Pedido();
RFWLogger.logObject("Estado do pedido antes do processamento", pedido, "DEPURAÇÃO", "PEDIDO");

Este exemplo mostra como o RFWLogger pode ser usado para registrar o estado de um objeto antes de uma operação crítica, facilitando a depuração se algo der errado.

Depuração e Análise

A utilização eficaz do RFWLogger permite uma análise detalhada dos eventos registrados no sistema. Aqui estão algumas dicas para usar os logs na depuração e monitoramento:

  • Identificação de Problemas Recorrentes: Ao analisar os logs, preste atenção em mensagens de erro e exceção que se repetem, indicando problemas que precisam de correção.
  • Monitoramento de Recursos: Use logs de aviso para monitorar o uso de recursos como memória e CPU, e identificar possíveis gargalos antes que causem falhas no sistema.
  • Rastreamento de Fluxo de Execução: Utilize logs de depuração para acompanhar o fluxo de execução do sistema, especialmente em operações complexas que envolvem várias etapas ou componentes.
  • Análise Pós-Morte: Após uma falha, os logs são a principal ferramenta para entender o que ocorreu. Certifique-se de que as mensagens de log incluam todas as informações relevantes, como parâmetros de entrada e o estado do sistema.

Esses exemplos e dicas mostram como o RFWLogger pode ser integrado no fluxo de trabalho diário para melhorar a monitorização, a depuração e a manutenção do sistema.

Limitações Conhecidas

Uso Cíclico do RFWLogger

Stop 256.png
Limitação de Uso Interno do RFWLogger

Um dos problemas do modelo atual do RFWLogger é que ele não pode ser utilizado diretamente nas classes que ele próprio utiliza, como nos métodos do RFWInterceptor e do RFWDAO. Isso ocorre porque, quando o RFWLogger tenta persistir os logs no banco de dados, ele gera novos logs sobre essa operação, resultando em um ciclo recursivo de persistência de logs.

Por esse motivo, é recomendado que esses tipos de logs continuem sendo registrados pelo sistema de log em arquivo do servidor de aplicação, evitando o problema de recursão infinita.

Uma solução potencial seria a criação de um DAO exclusivo para o RFWLogger, o que eliminaria o problema ao utilizá-lo com o RFWDAO. No entanto, o problema relacionado ao `SessionManager#SMInterceptor` exigiria o desenvolvimento de uma fachada completa apenas para esse propósito. Embora essa solução seja viável, ela ainda não foi implementada. Para saber se o sistema está em modo de desenvolvimento, consulte a classe RFW.


Múltiplos ClassLoaders da Aplicação

O RFWLogger é uma classe estática que é carregada pelo ClassLoader do módulo onde está localizada. Em uma aplicação J2EE, onde diferentes módulos (como WARs e EJBs) podem ser gerenciados por diferentes ClassLoaders, essa característica pode gerar problemas se não for adequadamente configurada.

Cada módulo que levanta seu próprio ClassLoader requer uma configuração específica da implementação da interface RFWLoggerImplementation. Se a implementação personalizada do logger não for configurada em cada um desses ClassLoaders, poderão ocorrer os seguintes problemas:

  • Inconsistência nos Logs: Diferentes módulos da aplicação podem acabar utilizando implementações de log diferentes, resultando em logs que não são centralizados ou que seguem padrões distintos, dificultando a análise e o monitoramento.
  • Falha na Configuração Customizada: Se a implementação correta não for configurada em todos os módulos, alguns módulos podem continuar usando a implementação padrão do RFWLogger, o que pode não atender aos requisitos específicos da aplicação (como gravar logs em arquivos específicos ou sistemas de monitoramento).

Para evitar esses problemas, é crucial garantir que a implementação do RFWLogger seja corretamente configurada em cada módulo da aplicação J2EE, assegurando uma experiência de logging consistente em todo o sistema.

Referências e Links

Referência a Outros Componentes

  • RFWBundle: Classe utilizada para obter mensagens de erro e outras informações internacionalizadas no sistema. É frequentemente usada em conjunto com o RFWLogger para registrar logs localizados.
  • RFWValidationException: Exceção específica para erros de validação, registrada com a severidade `VALIDATION` no RFWLogger.
  • RFWValidationGroupException: Exceção que agrupa múltiplos erros de validação, também registrada com a severidade `VALIDATION`.
  • RUReflex: Classe utilizada para refletir e imprimir o estado de objetos no log, particularmente útil para o método `logObject` do RFWLogger.