Introdução
O Morgan é uma biblioteca que pode ser utilizada no NodeJS para salvar o log das requisições feitas a API.
E o uso do Morgan no Node pode ser importante, pois com ele, é possível monitorar todos os dados de entrada de sua API, verificar se tem algum dado incorreto que está sendo enviado e entre outros casos de uso.
Esse monitoramento pode facilitar, integração de terceiros com a sua API, integração de outras partes do seu código e muito mais.
Além da biblioteca do Morgan, tem uma variação dela chamada Morgan-body, que com ela, é possível salvar os dados do corpo da requisição, coisa que só com o Morgan não é possível.
Por padrão, os dados de log são impressos no terminal, porém é possível salvar os logs em arquivo, e assim manter o histórico de todas as requisições da API.
Outra possibilidade com os logs salvos no arquivo, é fazer arquivo de log rotativo, basicamente é criar um arquivo de texto para cada dia, dessa forma, caso o log de um mês atrás por exemplo não seja mais útil, é possível excluí-lo dando lugar a outro log.
Primeiro exemplo com Morgan
Para o primeiro exemplo, tenha um projeto Node já instalado, caso você não saiba fazer isso, vou deixar um link aqui.
Dentro da pasta desse projeto, primeiramente é necessário instalar as dependências que serão utilizadas, que serão a do Express, Body-parser e Morgan-body. O Body-parser será utilizado para pegar os dados da request.
Para instalar as dependencias:
> npm install express body-parser morgan-body
Dentro da pasta raiz do projeto, crie um arquivo chamado server.js que é o arquivo que receberá o código.
Depois de instalado as dependências, dentro do server.js, é necessário realizar os imports, fazer um app.use no body-parser e posteriormente utilizar o morgan-body, depois disso, precisa ter uma rota, que pode ser para a / e usar o app.listen para iniciar o servidor o arquivo deve ficar assim:
import morganBody from 'morgan-body';
import express from 'express';
import bodyParser from 'body-parser';
const app = express();
app.use(bodyParser.json());
morganBody(app);
app.get('/', (req, res) => {
res.send(‘Ola mundo’)
});
app.listen(3000, () => {
console.log('Rodando na porta 3000');
});
com isso o morgan já está sendo utilizado e já está configurado, basta acessar do navegador o endereço http://localhost:3000, e verificar no terminal, que já irá aparecer a requisição realizada.
Salvando o log em arquivo
Para salvar essa informação em arquivo, é necessário importar o fs e o path, que são para manipular arquivos e adicionar algumas configurações ao morgan, para que o funcionamento do arquivo fique correto e para que os logs sejam salvos.
Na aplicação é necessário criar uma pasta chamada “logs” dentro do src, no arquivo além das importações, é necessário criar a configuração que irá criar e inserir dados no arquivo, e depois é só passar esse arquivo ao morgan-body, que irá cuidar do resto. O server.js deve ficar assim:
import morganBody from 'morgan-body';
import express from 'express';
import bodyParser from 'body-parser';
const fs = require('fs');
const path = require('path');
const app = express();
app.use(bodyParser.json());
const log = fs.createWriteStream(
path.join(__dirname, "./logs", `express.log`), { flags: "a" }
);
morganBody(app, {
noColors: true,
stream: log,
});
app.get('/', (req, res) => {
res.send(‘Ola mundo’)
});
app.listen(3000, () => {
console.log('Rodando na porta 3000');
});
A constante log, irá conter os dados do arquivo, e posteriormente essa constante é passada para o morgan-body na opção stream. Além disso é necessário passar o noColors como true, para que o arquivo seja salvo corretamente, passando noColors como false, que é o padrão da variável, os logs ficarão desconfigurados dentro do arquivo.
Dessa forma, assim que iniciar novamente o servidor, dentro da pasta logs já irá conter o arquivo express.log, e as próximas requisições já serão salvas dentro dele.
Salvando log em arquivo rotativo
Essa opção é interessante, caso depois de um tempo se utilizar os logs antigos, eles podem ser excluídos. O log rotativo, nada mais é do que passar a data junto ao nome do arquivo, e com isso, cada dia terá um arquivo de log especifico, e caso não seja utilizado, pode ser deletado normalmente.
Para implementar essa solução, é necessário concatenar a data dentro do arquivo. Para trabalhar com datas, o moment é uma biblioteca que já traz uma série de recursos úteis, sua instalação no projeto é feita no terminal, com o comando:
> npm install moment
Após sua instalação, é preciso importá-lo no projeto e utilizar na frente do nome do arquivo, deixando o server.js dessa forma:
import morganBody from 'morgan-body';
import express from 'express';
import bodyParser from 'body-parser';
const fs = require('fs');
const path = require('path');
const app = express();
app.use(bodyParser.json());
const log = fs.createWriteStream(
path.join(__dirname, "./logs", `express${moment().format('YYYY-MM-DD')}.log`), { flags: "a" }
);
morganBody(app, {
noColors: true,
stream: log,
});
app.get('/', (req, res) => {
res.send(‘Ola mundo’)
});
app.listen(3000, () => {
console.log('Rodando na porta 3000');
});
Com essas mudanças, a cada dia a aplicação irá registrar o log em um arquivo diferente e posteriormente é possível realizar uma lógica para que estes sejam excluídos caso inutilizados.
Vídeo sobre o assunto
Caso você queira, gravei um vídeo sobre o morgan-body, onde mostro passo a passo como realizar todas essas configurações:
Conclusão
O morgan é muito interessante para salvar os logs da aplicação, e salvar essa informação pode ser muito útil no dia a dia, visto que a aplicação está sujeita a muitos acessos e nem todos podem ser feitos com sucesso, e saber quais falharam e com quais dados, pode ser valioso para resolver problemas mais rápido, as vezes antes mesmo do seu cliente abrir um chamado no suporte. Obrigado por ler até aqui, até o próximo post 🙂
Para ver outros canais onde o posto conteúdo, meu Github e também cursos, veja os Links do Programando Soluções.