Graylog: Utilizar com Node.js

Como enviar logs de Node.js para o Graylog

👋 Bem-vindo à documentação da Stackhero!

A Stackhero oferece uma solução Graylog cloud pronta a usar que proporciona uma série de benefícios, incluindo:

  • Servidor de email SMTP ilimitado e dedicado incluído.
  • Atualizações sem esforço com apenas um clique.
  • Nome de domínio personalizável seguro com HTTPS (por exemplo, https://logs.sua-empresa.com).
  • Desempenho ótimo e segurança robusta alimentados por uma VM privada e dedicada.

Poupe tempo e simplifique a sua vida: são necessários apenas 5 minutos para experimentar a solução Graylog cloud hosting da Stackhero!

Enviar logs de Node.js para o Graylog é bastante simples. Neste exemplo, irá ver como utilizar o pacote graylog2 para tornar este processo transparente.

Para começar, pode instalar o pacote executando o seguinte comando:

npm install graylog2

Veja como pode utilizá-lo para registar mensagens:

const graylog2 = require('graylog2');
const crypto = require('crypto');

const logger = new graylog2.graylog({
  servers: [{ host: '<XXXXXX>.stackhero-network.com', port: 12201 }] // Certifique-se de substituir "host" pelo seu domínio Graylog
});

// Enviar uma mensagem simples para o Graylog
logger.log('Simple message example');

// Anexar dados a uma mensagem
logger.log(
  'Password recovery email', // Mensagem
  // Um objeto JSON com detalhes adicionais
  {
    subject: 'Password recovery',
    language: 'en_US',
    domain: 'gmail.com'
  }
);

// Exemplo avançado
const ip = '1.2.3.4';
const ipHash = crypto.createHash('md5').update(ip).digest('hex');

const userId = '1234';
const userIdHash = crypto.createHash('md5').update(userId).digest('hex');

logger.log(
  'API request', // Mensagem
  // Um objeto JSON com mais detalhes
  {
    route: '/v1/messages/1234/',
    method: 'POST',

    responseTime: 12, // ms
    responseCode: 200,

    ipHash,
    userIdHash
  }
);

// Registar exceções não capturadas em Node.js
process.on(
  'uncaughtException',
  err => {
    logger.log(
      err,
      { type: 'uncaughtException' }
    );
  }
);

Para mais exemplos, pode consultar este repositório GitHub.

warning Não se esqueça de configurar o seu input Graylog (detalhes abaixo).

warning É preferível utilizar o pacote graylog2, exceto se já estiver a usar Winston no seu projeto. Nesse caso, pode substituí-lo por winston-gelf.

Para instalar o pacote Winston GELF, execute:

npm install winston-gelf

Se ainda não tiver o Winston no seu projeto, pode adicioná-lo com:

npm install winston

Aqui está uma configuração básica:

const winston = require('winston');
const winstonGelf = require('winston-gelf');
const process = require('process');

const logger = winston.createLogger({
  transports: [
    new winston.transports.Console(),
    new winstonGelf({
      // Consulte todas as opções do gelfPro aqui: https://www.npmjs.com/package/gelf-pro
      gelfPro: {
        fields: {
          env: process.env.NODE_ENV || 'development'
        },
        adapterName: 'udp',
        adapterOptions: {
          host: '<XXXXXX>.stackhero-network.com', // Substitua pelo seu domínio Graylog
          port: 12201,
        }
      }
    })
  ]
});

// Exemplo de log informativo
logger.info('This is a log information');

// Exemplo de log de erro
try {
  throw Error('This is an example error');
}
catch(error) {
  logger.warn({ message: 'Error triggered', error });
}

Não se esqueça de configurar o seu input Graylog (detalhes abaixo).

Na interface do Graylog, aceda a System/Inputs, crie um novo input do tipo "GELF UDP" e clique em "Launch new input". Na janela que aparece, selecione "Global", adicione um título e confirme sem alterar as restantes definições.

E está feito! O seu Graylog está agora pronto para receber logs da sua aplicação Node.js.

Para reforçar a segurança, considere filtrar os IPs autorizados a enviar dados para a porta 12201. Pode fazê-lo no dashboard da Stackhero, selecionando o seu serviço Graylog e configurando o "Firewall" para permitir apenas os seus IPs.