Registro de aplicações

Uma das funcionalidades básicas de qualquer aplicação é a capacidade de exibir os registros de execução da aplicação. As opções de registro mais utilizadas são: info (informações), warning (avisos) e error (erros).

Winston

Winston é uma biblioteca de registros e foi projetada para realizar o registro das informações da aplicação de forma assíncrona, respeitando a arquitetura do Node.js.

Para mais informações sobre o Winston, acesse https://github.com/winstonjs/winston.

Instalando o Winston

Para instalar o Winston, abra o Terminal e digite:

$ npm i winston

Esse comando instala o Winston como dependência no package.json.

  "dependencies": {
    "winston": "3.1.0"
  }

Utilizando o Winston

Para utilizar o Winston no projeto, edite o arquivo index.js.

const winston = require('winston');

winston.info('Hello Winston');

Salve o arquivo e aguarde o Nodemon reiniciar a aplicação. Assim que a aplicação for reiniciada, a seguinte informação é exibida no Terminal.

[winston] Attempt to write logs with no transports {"message":"Hello Winston","level":"info"}

O Winston foi projetado para trabalhar com transportes. Um transporte é uma opção de armazenamento dos registros das aplicações. Esses armazenamentos podem ser um arquivo de texto, uma conexão com o banco de dados ou uma simples saída no stdout.

Centralizando o registro de aplicações

Uma técnica muito interessante para realizar o registro de aplicações é separar a lógica em um módulo e reutilizá-lo em toda a aplicação. Os benefícios do módulo de registros são:

  • Padronizar as informações dos registros
  • Facilidade para adicionar ou alterar os transportes
  • Possibilidade de trocar a biblioteca de registros

Criando o módulo de registro de aplicações

Como o Winston trabalha com transportes, devemos configurar no mínimo um transporte. Nesse treinamento iremos utilizar o tipo de tranporte Console que é parecido com as funcionalidades do console do Node.js.

Para mais informações sobre os transportes do Winston, acesse: https://github.com/winstonjs/winston#transports.

Para criar o módulo de registro de aplicações, crie o arquivo logger.js.

const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.simple(),
  transports: [new winston.transports.Console()]
});

module.exports = logger;

Esse módulo exporta o objeto logger com as funções do Winston e pode ser utilizado por toda a aplicação.

Para utilizar o módulo na aplicação, edite o arquivo index.js.

const logger = require('./logger');

logger.info('Hello Winston');

Salve o arquivo e aguarde o Nodemon reiniciar a aplicação. Assim que a aplicação for reiniciada, a seguinte informação é aprensentada no Terminal.

info: Hello Winston

Mundo Real

console

Embora o console seja a opção mais utilizada pela maioria dos desenvolvedores, ela pode impactar no desempenho da aplicação.

O Node.js foi contruído para trabalhar com instruções assíncronas e é extremamente importante respeitar essa arquitetura. Em algumas situações, o console pode se comportar de forma síncrona, fazendo com que a execução do Node.js seja bloqueada até que o console finalize sua execução.

O console pode ser utilizado no ambiente de desenvolvimento, mas não deve ser utilizado no ambiente de produção. Existem outras formas de realizar o registro das atividades da aplicação, sem utilizar o console.

Para mais informações sobre a arquitetura do Node.js, acesse o Guia oficial do Node.js.

ESLint

Utilize o ESLint para não permitir a utilização do console. Quando a análise estática for realizada, o ESLint irá sinalizar quais arquivos estão violando a regra. Os arquivos iniciais desse treinamento já estão com essa regra configurada.

Caso você não esteja utilizando as configurações do ESLint fornecidas por esse treinamento e queira habilitar a regra manualmente, edite o arquivo eslintrc.json.

  "rules": {
    "no-console": "error"
  }

Custo

O registro de aplicações, mais conhecidos como logs, são registros como qualquer outro e eles consomem espaço em disco. Evite registrar informações desnecessárias para não impactar no custo do projeto. Dependendo da quantidade de logs de uma aplicação, o armazenamento do log custa mais caro que a própria aplicação.

Existem maneiras de reduzir o custo dos logs de uma aplicação, reduzindo a quantidade de registros que devem ser retidos. Essa parametrização varia de provedor para provedor.

Resumo

  • Implementamos o módulo de registro de aplicações
  • Aprendemos os benefícios de utilizar módulos nas aplicações
  • Entendemos a importância de não utilizar instruções síncronas para não bloquear a execução do Node.js
  • Conhecemos uma alternativa ao console para realizar o registro de aplicações de forma assíncrona