Bootstrap FreeKB - Node.js - Getting Started with Winston logger
Node.js - Getting Started with Winston logger

Updated:   |  Node.js articles

The winston package is used to provide the winston logger. The npm list command can be used to determine if you have the winston package installed. If not, the npm install command can be used to install the winston package. Once installed, your package.json should include the winston package.

{
  "dependencies": {
    "winston": "^3.13.1"
  }
}

 

Let's say you have a file named app.js that contains the following.

const winston = require('winston');

const logger = winston.createLogger({
  format: winston.format.simple(),
  transports: [
    new winston.transports.File({ filename: 'all.log' }),
  ],
});

logger.error("my error message");
logger.warn("my warning message");
logger.info("my info message");

 

Or if you are using an ES6 module, you'll use import instead of require.

import winston from 'winston';

 

In this example, running app.js will produce no console output since the transports list only contains File transports. However, this should append the following to all.log.

error: my error message
warn: my warning message
info: my info message

 

However, I almost always have the require constant setup like this so that I don't have to use the "winston" keyword in the logger construct.

const { createLogger, format, transports } = require('winston');

const logger = createLogger({

  format: format.json(),
  transports: [
    new transports.File({ filename: 'all.log' }),
  ],
});

logger.error("my error message");
logger.warn("my warning message");
logger.info("my info message");

 

If you also want to include the output on the console, you can include the Console transport.

const { createLogger, format, transports } = require('winston');

const logger = createLogger({
  format: format.simple(),
  transports: [
    new transports.Console(),
    new transports.File({ filename: 'all.log' }),
  ],
});

logger.error("my error message");
logger.warn("my warning message");
logger.info("my info message");

 

If you want to append events to their own log file base on level, you can create log files for each level.

const { createLogger, format, transports } = require('winston');

const logger = createLogger({
  format: format.simple(),
  transports: [
    new transports.File({ filename: 'info.log',  level: 'info' }),
    new transports.File({ filename: 'warn.log',  level: 'warn' }),
    new transports.File({ filename: 'error.log', level: 'error' }),    
  ],
});

logger.error("my error message");
logger.warn("my warning message");
logger.info("my info message");

 

format.json() can be used to format the output to be JSON.

const { createLogger, format, transports } = require('winston');

const logger = createLogger({
  format: format.json(),
  transports: [
    new transports.Console(),
    new transports.File({ filename: 'all.log' }),
  ],
});

logger.error("my error message");
logger.warn("my warning message");
logger.info("my info message");

 

I almost always want to include the timestamp in the logger, perhaps like this.

const { createLogger, format, transports } = require('winston');
const { combine, timestamp, printf } = format;

const myFormat = printf(({ timestamp, level, message }) => {
  return `[${timestamp} ${level}] ${message}`;
});

const logger = createLogger({
  format: combine(
    timestamp(),
    myFormat
  ),
  transports: [
    new transports.Console(),
    new transports.File({ filename: 'all.log' })
  ]
});

logger.error("my error message");
logger.warn("my warning message");
logger.info("my info message");

 

Which should produce something like this.

[2024-07-17T01:31:40.949Z error] my error message
[2024-07-17T01:31:40.951Z warn] my warning message
[2024-07-17T01:31:40.952Z info] my info message

 




Did you find this article helpful?

If so, consider buying me a coffee over at Buy Me A Coffee



Comments


Add a Comment


Please enter 615d21 in the box below so that we can be sure you are a human.