Skip to content

Setup Logger

Dhruv Saxena edited this page Jul 15, 2021 · 5 revisions

Logger

Setup logger for the project.

FAQ

Where to change?

file-path: src/helpers/logger/index.ts

Is there any pre-installed logger?

Yes, Pino is pre-installed and pre-configured.

Installation

Winston

Install winston logger

  yarn add winston

Setup logger file

import winston, { format, LoggerOptions } from 'winston';
const { combine, timestamp, printf } = format;
import { env } from '../env-helper';
import { getResponseTime } from './utils';

// Types
import { Request, Response, NextFunction } from 'express';
const formatter = printf(({ level, message, timestamp }) => {
  return `[${timestamp}] ${level.toUpperCase()}: ${message}`;
});

const config: LoggerOptions = {
  level: 'debug',
  format: combine(timestamp(), formatter),
  transports: [
    env.string('NODE_ENV') !== 'production'
      ? new winston.transports.Console()
      : new winston.transports.File({ filename: 'debug.log' }),
  ],
};

const logger = winston.createLogger(config);

const apiLogger = (req: Request, res: Response, next: NextFunction): void => {
  (async () => {
    const delta = getResponseTime(process.hrtime()).toLocaleString();
    const message = `${req.method} ${req.url} (${delta} ms)`;

    logger.debug(message);
    next();
  })();
};

//! Do-not rename logger and apiLogger functions
export { logger, apiLogger };

Pino

Pino is pre-installed with the project, here's the default setup for it.

yarn add pino pino-pretty
yarn add -D @types/pino

Default configurations

import pino from 'pino';
import { env } from '../env-helper';
import { getResponseTime } from './utils'

import { Request, Response, NextFunction } from 'express';

const config: pino.LoggerOptions = {
  level: env.string('LOG_LEVEL', 'debug'),
  timestamp: () => `,"time":"${new Date(Date.now()).toISOString()}"`,
};

let logger: pino.BaseLogger;
if (env.string('NODE_ENV') !== 'production') {
  logger = pino({
    ...config,
    prettyPrint: {
      colorize: true,
      translateTime: 'yyyy-mm-dd HH:MM:ss',
    },
  });
} else {
  logger = pino(
    config,
    pino.destination({
      dest: 'debug.log',
      sync: false,
    }),
  );
}

const apiLogger = (req: Request, res: Response, next: NextFunction): void => {
  (async () => {
    const delta = getResponseTime(process.hrtime()).toLocaleString();
    const message = `${req.method} ${req.url} (${delta} ms)`;
    logger.debug(message);
    next();
  })();
};

//! Do-not rename logger and apiLogger
export { logger, apiLogger };
Clone this wiki locally