A importância dos logs na sua aplicação
Tags: log, java, kibana, devops
Published: 2022-10-01 18:34:44

### Introdução

As vezes não damos aos logs a importância que eles tem e com isso não conseguimos usar a capacidade que eles tem em ajudar no dia a dia de uma aplicação em produção.

Nada sabe mais sobre a falha do que a própria aplicação que falhou, por tanto podemos usar os logs para saber o que estava se passando na aplicação quando ela falhou.  

### Quando podemos usar os logs?

Podemos usar o poder dos logs em diversos aspectos vou listar alguns como:

- Validação de novas funcionalidades
- Análise de erros
- Criação de alarmes e visualizações

**Validação de novas funcionalidades**

É legal sempre que lançarmos alguma funcionalidade nova, sabermos se ela está sendo usada ou se está atendendo o objetivo para qual ela foi implementada, com base nisso podemos lançar os logs sempre que uma rotina for finalizada com sucesso.

Um exemplo, foi lançada uma funcionalidade que cria prontuário de paciente sempre que ele faz seu primeiro atendimento no hospital, até pouco tempo na aplicação não era possível fazer isso de formal automática, que tal lançar um log sempre que essa funcionalidade rodar com sucesso? dessa forma saberemos que funcionalidade entregue em produção funcionou com sucesso.

**Análise de erros**

Tão importante quanto sabermos quando uma funcionalidade nova roda com sucesso é saber quando essa mesma falha, sempre vai existir a possibilidade de algum cenário não mapeado acontecer e literalmente quebrar sua funcionalidade, é importante que saibamos o mais rápido possível para entender e corrigir esse cenário não mapeado.

O log poderá nos ajudar exibindo o máximo possível de informações sobre o cenário que ocorreu, informações como:

- Classe
- Método
- Variáveis

pois essas informações certamente ajudarão a entender o cenário e agilizar a definição da solução.

**Criação de alarmes e visualizações**

Existe no mercado diversos centralizadores de logs onde um dos principais objetivos é facilitar a visualização dos mesmos.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cqbwjgfu9i0qx2sd8eab.png)

Ferramentas como Splunk e Kibana permitem criar alarmes a partir de consultas em logs, por exemplo, sempre que chegar um log de **"erro ao salvar paciente"** deve ser disparado um alarme para que time de desenvolvimento/sustentação possam agir para corrigir o mais rápido possível o problema em produção.

### Existe algum framework para logs?

No mundo java um dos Frameworks mais populares é o [Log4J](https://logging.apache.org/log4j/2.x/), com ele podemos deixar nossos logs mais eficientes e programáveis, podemos definir também um padrão de log como por exemplo:

```CSS
"%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n";
```

com essa configuração nosso log será mais ou menos assim:

```shell
17:13:01.540 [main] ERROR com.foo.Bar - Did it again!
```

Observa que temos a palavra **ERROR**, com o log4j temos níveis de log que poderemos relacionar com a gravidade do que aconteceu.

Vamos fazer um exemplo, imagine que temos o método abaixo

```Java
public void salvar(Paciente paciente {
  paciente.repository(paciente);
}
```

Para deixar claro que esse método foi executado com sucesso, ele ficaria mais ou menos assim:

```Java
Logger logger = Logger.getLogger("br.com.MinhaClasse");
public void salvar(Paciente paciente){
  paciente.repository(paciente);
  logger.INFO("paciente salvo com sucesso");
}
```

Observe que agora temos uma linha de logger do tipo **INFO** logo após o passo que salva o paciente, seu log ficaria mais ou menos assim:

```
17:13:01.540 [main] INFO com.foo.Bar - Paciente salvo com sucesso
```

Agora que entendemos um pouco de como podemos usar o Log4j vamos ver como podemos lidar com erros:

```Java
public void salvar(Paciente paciente){
   try{
     paciente.repository(paciente);    
   }catch(Exception e){
       e.printStackTrace();
   }
}
```

Nessa classe acima podemos melhora-la deixando-a com logs para ajudar a entender o que aconteceu quando esse método executou.

```Java
public void salvar(Paciente paciente){
   try{
     paciente.repository(paciente);
     logger.INFO("paciente salvo com sucesso, paciente={}",paciente.getCodigo())
    }catch(Exception e){
       logger.ERROR("problema para salvar paciente, paciente={}",paciente.getCodigo());
    }
}
```

Observando o método a cima, agora é possível saber quando um paciente foi salvo com sucesso e quando um paciente teve problema. Para facilitar mais ainda o entendimento quando analisarmos os logs é a possibilidade de saber qual paciente deu erro.

### Dados sensíveis

Hoje em nosso país temos a lei [LGPD](http://www.planalto.gov.br/ccivil_03/_ato2015-2018/2018/lei/l13709.htm) que visa melhorar a segurança dos nossos dados na Internet. primordialmente não devemos logar nenhum dado que possa identificar unicamente uma pessoa como:

- CPF
- Data de Nascimento
- e-mail
- Nome completo
- etc

Então observe sempre o que estamos logando para não expor dados pessoais.

### Conclusão

É fácil começar a usar os logs para ajudar no entendimento do que acontece dentro da sua aplicação, então use e faça proveito dessa vantagens.