Log Rotation em Node.Js

Recentemente recebi uma solicitação de serviço para construir um aplicativo full stack. Então, sem pensar duas vezes, abri minha caixa TODO e procurei novos conceitos (para mim) ou tecnologias que tornariam meu projeto um pouco melhor.


Logs

Logs armazenam - em texto, por exemplo - erros, avisos e qualquer informação relevante para aplicações de monitoramento. Os dados armazenados são muitas vezes: eventos principais, desempenho do sistema, atividades de uso e entre outras coisas. O gerenciamento de logs envolve etapas como coleta, inserção, busca e análise, monitoramento e avisos, visualização e relatório. Tudo isso será de grande valia.

Rotation

A rotação de log é um processo automatizado para gerenciar arquivos de log. Podemos querer que nossos arquivos de log sejam compactados, movidos ou arquivados, renomeados ou excluídos quando forem muito antigos ou muito grandes. Queremos restringir o volume dos dados de log para evitar transbordar o armazenamento de registros, ao mesmo tempo em que mantemos os arquivos de log pequenos o suficiente. A rotação de logs nos ajuda a gerenciar os arquivos de log de nossos aplicativos.

Winston

No meu projeto mencionado acima, usei o winston para gerenciar logs. Winston é uma biblioteca para Node.js. O objetivo é aumentar a flexibilidade e adaptabilidade do registro, separando vários componentes, como níveis de registro, formatação e armazenamento, permitindo que cada API opere de forma independente e suportando inúmeras combinações. Além disso, ele aproveita fluxos Node.js para mitigar o impacto no desempenho da integração do registro em log em seu aplicativo. Confira este tutorial, pode ser muito útil.

A aplicação

Então, eu estava configurando minha classe de manipulador de erros e senti a necessidade de configurar logs para este aplicativo. Primeiro, configurei os logs para console para fins de desenvolvimento. Winston oferece grande flexibilidade na escolha de onde você deseja que suas entradas de log sejam enviadas. O transporte do console é uma opção disponível por padrão.

transports: [new winston.transports.Console()];

No ambiente de produção, preciso armazenar os dados de log em algum lugar. Uma solução potencial era usar o transporte de arquivos. Mas com o tempo, um único arquivo para armazenar todos os dados de log é uma loucura e terrível para monitorar e filtrar esses dados posteriormente. Mais uma vez, wiston fornece recursos para este problema. Decidi restringir o tamanho do arquivo e criar um novo arquivo de log todos os dias e excluir automaticamente aqueles anteriores a um período de tempo.

const fileRotateTransport = new winston.transports.DailyRotateFile({
  filename: 'combined-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  maxFiles: '14d',
  fileSize: '100m'
});

Também tive outros cuidados para ter um melhor desempenho. Separei os níveis de log que faziam sentido para o aplicativo. Os níveis 'Info' e 'Error' foram separados em arquivos diferentes - error-YYYY-MM-DD.log e info-YYYY-MM-DD.log, os outros níveis foram mantidos no mesmo arquivo combinado-YYYY-MM-DD .registro. Isso ajudará quando ocorrerem bugs, basta olhar o arquivo de log de erros do dia em questão e posso encontrar rapidamente a mensagem de erro. Outra abordagem foi formatar as mensagens de log de forma amigável.

{"level":"info","message":"Info message","timestamp":"2022-01-25T15:50:09.641Z"}

Isso é tudo por hoje, espero que esse texto te ajude de alguma forma. Deixe-me saber se você tiver alguma dúvida. Você usa log para monitorar seu aplicativo? Como você lida com seus registros? Estou ansioso para saber.