Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I add timestamp to logs using Node.js library Winston?

I want to add timestamp to logs. What is the best way to achieve this?

like image 870
kolrie Avatar asked Apr 22 '12 19:04

kolrie


People also ask

How do you implement Winston in node js?

Here's a guide that will help you understand NPM in detail. Install the Winston package using the command npm install winston . Logging with Winston is simple, with just four steps, as shown in the example below, and you have your log recorded. Add the Winston module with a require() function.

What is Winston in node js?

Winston is the most popular logging library for Node. js. It aims to make logging more flexible and extensible by decoupling different aspects such as log levels, formatting, and storage so that each API is independent and many combinations are supported. It also uses Node.

Is Winston logging asynchronous?

After a quick review of the source on github, I'd say that no, winston is not truly async in all aspects. It does emit , but EventEmitter is not async. Methods have an async-style signature (w/ callback ), but are not always async.


2 Answers

I was dealing with the same issue myself. There are two ways I was able to do this.

When you include Winston, it usually defaults to adding a Console transport. In order to get timestamps to work in this default case, I needed to either:

  1. Remove the console transport and add again with the timestamp option.
  2. Create your own Logger object with the timestamp option set to true.

The first:

var winston = require('winston'); winston.remove(winston.transports.Console); winston.add(winston.transports.Console, {'timestamp':true}); 

The second, and cleaner option:

var winston = require('winston'); var logger = new (winston.Logger)({     transports: [       new (winston.transports.Console)({'timestamp':true})     ] }); 

Some of the other options for Console transport can be found here:

  • level: Level of messages that this transport should log (default 'debug').
  • silent: Boolean flag indicating whether to suppress output (default false).
  • colorize: Boolean flag indicating if we should colorize output (default false).
  • timestamp: Boolean flag indicating if we should prepend output with timestamps (default false). If function is specified, its return value will be used instead of timestamps.
like image 190
imagreenplant Avatar answered Oct 20 '22 05:10

imagreenplant


Above answers did not work for me. In case you are trying to add timestamp to your logs using the latest version of Winston - 3.0.0-rc1, this worked like charm:

    const {transports, createLogger, format} = require('winston');      const logger = createLogger({         format: format.combine(             format.timestamp(),             format.json()         ),         transports: [             new transports.Console(),             new transports.File({filename: 'logs/error/error.log', level: 'error'}),             new transports.File({filename: 'logs/activity/activity.log', level:'info'})         ]     }); 

I used 'format.combine()'. Since I needed timestamp on all my transports, I added the formatting option within the createLogger, rather than inside each transport. My output on console and on file (activity.log) are as follows:

{"message":"Connected to mongodb","level":"info","timestamp":"2018-02-01T22:35:27.758Z"} {"message":"Connected to mongodb","level":"info","timestamp":"2018-02-01T22:35:27.758Z"} 

We can add formatting to this timestamp in 'format.combine()' as usual using:

format.timestamp({format:'MM-YY-DD'}) 
like image 23
Siva Kiran Avatar answered Oct 20 '22 06:10

Siva Kiran