Tag Archives: Log4j

Bysutradi

Como usar Log em aplicações

O uso de Logs em aplicações é uma boa prática para apoiar a equipe de desenvolvimento a encontrar ocorrências (erros) apontadas pelos usuários. Neste ponto não abordarei a prática do TDD, ok?

Pensando no uso do Log4J, um dos principais frameworks de Log, você sabe usar os tipos mensagens que podem ser apresentadas e usá-las de uma forma a ajudá-lo?

Vejam abaixo alguns pontos sobre os principais usos.

INFO

O nível INFO é utilizado para informar eventos significativos do ciclo de vida normal da aplicação. Exemplo:

LOG.info("Conta para o CPF " + cpf + " foi cadastrada com sucesso pelo usuário " + usuario);
LOG.info("SMS enviado com sucesso para o cliente " + cpf);

DEBUG

O nível DEBUG é normalmente utilizado como um complemento ao nível INFO como, por exemplo, parâmetros de um determinado método ou resultado de uma operação que pode ser importante para o rastreamento de problemas na aplicação. Exemplo:

// no início do método
LOG.debug("salvarConta(" + cpf + ", " + usuario + ")");

// no fim do método
LOG.debug("salvarConta finalizado em " + tempo + " milisegundos");

ERROR

O nível ERROR é utilizado mais freqüentemente, normalmente seguindo uma Java Exception. Essas condições de erro, não necessariamente causam o término anormal da aplicação, sendo que a aplicação pode continuar atendendo às próximas requisições normalmente. Exemplo:

// Dentro de um catch
LOG.error("Erro na tentativa de salvar a conta para o CPF " + cpf + ". Erro: " + exception);

WARN

O nível WARN indica problemas de menor gravidade, normalmente causados por fatores externos, como falta ou inconsistência de parâmetros passados pelo usuário. Exemplo:

LOG.warn("O parâmetro CPF não foi preenchido");

LOG.warn("A Mensagem " + nomeMensagem + " deveria ter 120 caracteres, mas veio com 118");

Exemplo prático

Suponhamos que temos a regra “Ao cadastrar a conta, enviar SMS para cliente.”, a implementação seria algo como:

// Início do método salvarConta
LOG.debug("salvarConta(" + cpf + ", " + usuario + ")");
try {
// Cadastrar Conta
LOG.info("Conta para o CPF " + cpf + " foi cadastrada com sucesso pelo usuário " + usuario);
// Enviar SMS
LOG.info("SMS enviado com sucesso para o cliente " + cpf);
} catch (ExceptionNegocio en) {
// Tratar aqui também com WARN, DEBUG ou ERROR
} catch (Exception exception) {
LOG.error("Erro na tentativa de salvar a conta para o CPF " + cpf + ". Erro: " + exception);
}
LOG.debug("salvarConta finalizado em " + tempo + " milisegundos");
// Fim do método salvarConta

Claro, a forma de uso pode ser mais refinada para cada projeto.

Bysutradi

Configurar Logging Profile no JBoss EAP 6.1

O JBoss EAP 6.1 contém um recurso chamado Logging Profile, que permite que as aplicações possam usar um profile de Log definido no servidor.

Porém, a documentação da Red Hat para o EAP apresenta somente a configuração necessária para usar o Logging Profile em standalone.

Se for usar seu EAP 6.1 em modo Domain, a configuração muda “ligeiramente” do que está na documentação da Red Hat.

Vou apresentar abaixo o que você precisa fazer.

1. Inicie seu JBoss em modo Domain.

2. Em uma outra janela  do seu terminal (ou CMD), execute o script jboss-cli.

./jboss-cli.sh -c

3. Execute os comandos abaixo para criar um Logging Profile, um Logging Handler.

/profile=full-ha/subsystem=logging/logging-profile=MY_LOGGING_PROFILE/:add
/profile=full-ha/subsystem=logging/logging-profile=MY_LOGGING_PROFILE/file-handler=MY_LOGGING_PROFILE_HANDLER:add(file={path=>"MY-LOG-FILE.log", "relative-to"=>"jboss.server.log.dir"})
/profile=full-ha/subsystem=logging/logging-profile=MY_LOGGING_PROFILE/file-handler=MY_LOGGING_PROFILE_HANDLER:change-log-level(level="DEBUG")
/profile=full-ha/subsystem=logging/logging-profile=MY_LOGGING_PROFILE/logger=com.mycompany.myapp:add(level=TRACE)
/profile=full-ha/subsystem=logging/logging-profile=MY_LOGGING_PROFILE/logger=com.mycompany.myapp:assign-handler(name="MY_LOGGING_PROFILE_HANDLER")

A diferença para a configuração na Red Hat é a definição do profile no início de cada comando.

Estes comandos alteram o arquivo domain.xml adicionando o trecho de código abaixo no profile “full-ha“.

<logging-profiles>
   <logging-profile name="MY_LOGGING_PROFILE">
        <file-handler name="MY_LOGGING_PROFILE_HANDLER">
            <level name="DEBUG"/>
            <file relative-to="jboss.server.log.dir" path="MY-LOG-FILE.log"/>
        </file-handler>
        <logger category="com.mycompany.myapp">
            <level name="TRACE"/>
            <handlers>
                <handler name="MY_LOGGING_PROFILE_HANDLER"/>
            </handlers>
        </logger>
    </logging-profile>
</logging-profiles>

4. Configure seu pom.xml para adicionar o nome do Logging Profile no MANIFEST.MF.

Para projetos WAR

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-war-plugin</artifactId>
	<version>2.3</version>
	<configuration>
		<filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
		<archive>
		<manifestEntries>
      <Logging-Profile>MY_LOGGING_PROFILE</Logging-Profile>
    </manifestEntries>
    </archive>
	</configuration>
</plugin>

Para projetos JAR/EJB

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-jar-plugin</artifactId>
	<version>2.4</version>
	<configuration>
		<filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
		<archive>
		<manifestEntries>
      <Logging-Profile>MY_LOGGING_PROFILE</Logging-Profile>
    </manifestEntries>
    </archive>
	</configuration>
</plugin>

Estas configurações foram validadas em projetos WAR com JSF e projetos EJB 3, implantados no EAP 6.1 em uma configuração MASTER com 1 SERVER GROUP com 1 SERVER.

Momendo #ficadica

Aqui #ficadica para alguém da Red Hat fazer a adição em sua documentação do EAP para que outros profissionais possam otimizar suas configurações ao ler as documentações do produto.

Momento #naogostei

Agora que as configurações foram feitas e foram validadas tecnicamente em projetos, vou colocar aqui o que acabou me deixando um pouco frustrado com Red Hat / JBoss.

Me frustrou bastante o fato que a documentação do EAP (pelo menos para este item) apresentar somente configurações com foco no modo Standalone.

Outro ponto que achei ruim foi o fato que, os códigos de erro que os comandos me apresentaram durante esta aprendizagem, não foram encontrados em mecanismos de busca, aumentando o tempo necessário para encontrar uma solução.