1

I try to send errors to sentry in the production environment:

import pino from 'pino';
const logger = pino(
    {
      level: 'error',
      formatters: {
        level: label => {
          return { level: label };
        },
      },
      transport: {
        target: 'pino-sentry-transport',
        options: {
          sentry: {
            dsn: 'xxxxx',
          },
        },
      },
      timestamp: () => `,"timestamp":"${new Date(Date.now()).toISOString()}"`,
    }
  );

I installed pino-sentry-transport and tried to log an error but it does not work. When I tried pino-sentry and used stream, all the level logs are sent to sentry without the error stack and context:

import pino from 'pino';
import { createWriteStream } from 'pino-sentry';

const logger = pino(
    {
      level: 'error',
      formatters: {
        level: label => {
          return { level: label };
        },
      },
      transport: {
        target: 'pino-sentry-transport',
        options: {
          sentry: {
            dsn: 'xxxxx',
          },
        },
      },
      timestamp: () => `,"timestamp":"${new Date(Date.now()).toISOString()}"`,
    },
createWriteStream({
    level: 'error',
    dsn: 'xxx',
    }),
  );
How can I fix that?
Slim
  • 5,527
  • 13
  • 45
  • 81

2 Answers2

1

The minLevel option for pino-sentry-transport enables this:

{
  target: 'pino-sentry-transport',
  options: {
    sentry: {
      dsn: "sentry-url"
    },
    minLevel: 40 // Only errors & above should be sent to Sentry.
  },
  level: 'error' // it seems that when configuring a single transport, this can be omitted (and defaults to 'info'). When configuring multiple ones, it's required.
}

Reference: pino-sentry-transport Usage

List of Numeric Log Levels in pinojs

muya_
  • 768
  • 7
  • 21
0

you can use the pino-sentry package instead of pino-sentry-transport. The pino-sentry package provides a stream that sends logs to Sentry

const pino = require('pino');
const pinoSentry = require('pino-sentry');

const logger = pino({
  level: 'error',
  formatters: {
    level: label => {
      return { level: label };
    },
  },
  timestamp: () => `,"timestamp":"${new Date(Date.now()).toISOString()}"`,
});

const stream = pinoSentry({
  dsn: 'xxx',
});

logger.pipe(stream);

you too can try creating separate logger instance just for error logging and configure it to use the pino-sentry-transport:

import pino from 'pino';
import pinoSentryTransport from 'pino-sentry-transport';
import * as Sentry from '@sentry/node';

Sentry.init({
  dsn: 'xxxxx',
});

const errorLogger = pino(
  {
    level: 'error',
    timestamp: () => `,"timestamp":"${new Date(Date.now()).toISOString()}"`,
  },
  pinoSentryTransport({ sentry: Sentry })
);

// Example error log
errorLogger.error(new Error('An error occurred!'));
Kareem Adel
  • 371
  • 2
  • 10