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

后端 未结 9 621
清歌不尽
清歌不尽 2021-01-31 12:55

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

相关标签:
9条回答
  • 2021-01-31 13:32

    Although I'm not aware of winston, this is a suggestion. I use log4js for logging & my logs by default look like this

    [2012-04-23 16:36:02.965] [INFO] Development - Node Application is running on port 8090
    [2012-04-23 16:36:02.966] [FATAL] Development - Connection Terminated to  '127.0.0.1' '6379'
    

    Development is the environment of my node process & [INFO|FATAL] is log level

    Maintaining different profiles for logging is possible in log4js. I have Development & Production profiles. Also there are logger types like rolling file appender, console appender, etc. As a addon your log files will be colorful based on the log level [Trace, Info, Debug, Error, Fatal] ;)

    log4js will override your console.log It is a configurable parameter now in 0.5+

    0 讨论(0)
  • 2021-01-31 13:34

    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.
    0 讨论(0)
  • 2021-01-31 13:34

    You can use built-in util and forever to achieve logging with timestap for your nodejs server. When you start a server add log output as part of the parameter:

    forever start -ao log/out.log server.js
    

    And then you can write util in your server.js

    server.js

    var util = require('util');
    util.log("something with timestamp");
    

    The output will look something like this to out.log file:

    out.log

    15 Mar 15:09:28 - something with timestamp
    
    0 讨论(0)
  • 2021-01-31 13:40

    I took Biswadev's answer and created a stringified JSON object. This way if i need to process the logs later it will be in a well structured format.

    const winston = require('winston');
    const { createLogger, format, transports } = require('winston');
    
    const dotenv = require('dotenv');
    dotenv.config();
    
    var logger = createLogger({
        level: 'info',
        format: format.combine(
            format.timestamp({
                format: 'YYYY-MM-DD HH:mm:ss',
            }),
            format.printf((info) =>
                JSON.stringify({
                    t: info.timestamp,
                    l: info.level,
                    m: info.message,
                    s: info.splat !== undefined ? `${info.splat}` : '',
                }) + ','
            )
        ),
    });
    
    if (process.env.NODE_ENV !== 'PRODUCTION') {
        logger.add(new transports.Console({ format: winston.format.cli() }));
    
        // Turn these on to create logs as if it were production
        // logger.add(new transports.File({ filename: 'log/output/error.log', level: 'error' }));
        // logger.add(new transports.File({ filename: 'log/output/warn.log', level: 'warn' }));
        // logger.add(new transports.File({ filename: 'log/output/info.log', level: 'info' }));
    } else {
        logger.add(new transports.File({ filename: 'log/output/error.log', level: 'error' }));
        logger.add(new transports.File({ filename: 'log/output/warn.log', level: 'warn' }));
        logger.add(new transports.File({ filename: 'log/output/info.log', level: 'info' }));
    }
    
    module.exports = {
        logger,
    };
    

    Usage:

    app.listen(port, () => logger.info(`app is running on port ${port}`));
    

    Output:

    info.log file:

    {"t":"2020-08-06 08:02:05","l":"info","m":"app is running on port 3001","s":""},
    

    Console:

    info:    app is running on port 3001
    
    0 讨论(0)
  • 2021-01-31 13:43

    Sometimes default timestamp format can be not convenient for you. You can override it with your implementation.

    Instead of

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

    you can write

    var winston = require('winston');
    var logger = new (winston.Logger)({
    transports: [
      new (winston.transports.Console)({
         'timestamp': function() {
            return <write your custom formatted date here>;
         }
      })
    ]
    });
    

    See https://github.com/winstonjs/winston#custom-log-format for the details

    0 讨论(0)
  • 2021-01-31 13:45

    we could use console-stamp to add timestamp and log level to the existing console: require('console-stamp')(console, '[yyyy-mm-dd HH:MM:ss.l]')

    See https://github.com/starak/node-console-stamp for the details

    0 讨论(0)
提交回复
热议问题