如何使用Node.js库Winston为日志添加时间戳?

时间:2012-04-22 19:33:59

标签: node.js logging winston

我想在日志中添加时间戳。实现这一目标的最佳方法是什么?

9 个答案:

答案 0 :(得分:105)

我自己也在处理同样的问题。我有两种方法可以做到这一点。

当您包含Winston时,它通常默认添加控制台传输。为了使时间戳在这种默认情况下工作,我需要:

  1. 删除控制台传输,然后使用timestamp选项再次添加。
  2. 创建您自己的Logger对象,并将timestamp选项设置为true。
  3. 第一个:

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

    第二个更清洁的选择:

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

    可以找到控制台传输的其他一些选项here

    • level:此传输应记录的消息级别(默认为“debug”)。
    • silent:布尔标志,指示是否抑制输出(默认为false)。
    • colorize:布尔标志,指示我们是否应该着色输出(默认为false)。
    • timestamp:布尔标志,指示我们是否应该在时间戳前面添加输出(默认为false)。如果指定了function,则将使用其返回值而不是timestamps。

答案 1 :(得分:36)

以上答案对我不起作用。如果您尝试使用最新版本的Winston - 3.0.0-rc1为您的日志添加时间戳,这就像魅力一样:

    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'})
        ]
    });

我使用了' format.combine()'。由于我需要在所有传输上使用时间戳,因此我在createLogger中添加了格式化选项,而不是在每个传输中添加。我在控制台和文件(activity.log)上的输出如下:

{"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"}

我们可以在' format.combine()'中为此时间戳添加格式像往常一样使用:

format.timestamp({format:'MM-YY-DD'})

答案 2 :(得分:9)

您可以使用内置utilforever来为您的nodejs服务器实现时间戳记录。 当您启动服务器时,添加日志输出作为参数的一部分:

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

然后你可以在server.js中编写util

<强> server.js

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

输出看起来像out.log文件:

<强> out.log

15 Mar 15:09:28 - something with timestamp

答案 3 :(得分:6)

我们也可以这样做

var winston = require('winston');
    const { createLogger, format, transports } = require('winston')
    var config = require('../configurations/envconfig.js');

    var loggerLevel = process.env.LOGGERLEVEL ||  config.get('LOGGERLEVEL');

    var logger = winston.createLogger({ format: format.combine(
            format.timestamp({
                format: 'YYYY-MM-DD HH:mm:ss'
            }),
            format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`+(info.splat!==undefined?`${info.splat}`:" "))
        ), 
        transports: [
            new (winston.transports.Console)({ level: loggerLevel }),
           ]
    });
    module.exports = logger;

答案 4 :(得分:4)

虽然我不知道温斯顿,但这是一个建议。我使用log4js进行日志记录和我的日志默认看起来像这样

[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'

开发是我的节点过程的环境&amp; [INFO | FATAL]是日志级别

在log4js中可以维护不同的日志记录。我有发展和生产概况。还有记录器类型,如滚动文件appender,控制台appender等。作为插件,你的日志文件将基于日志级别[跟踪,信息,调试,错误,致命]丰富多彩;)

log4js会覆盖你的console.log 这是一个可配置的参数,现在在0.5 +

答案 5 :(得分:2)

我们可以使用console-stamp将时间戳和日志级别添加到现有控制台:require('console-stamp')(console, '[yyyy-mm-dd HH:MM:ss.l]')

有关详细信息,请参阅https://github.com/starak/node-console-stamp

答案 6 :(得分:2)

有时默认的时间戳格式对您来说不方便。 您可以使用您的实现覆盖它。

而不是

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

你可以写

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

有关详细信息,请参阅https://github.com/winstonjs/winston#custom-log-format

答案 7 :(得分:2)

我接受了Biswadev的回答,并创建了一个字符串化的JSON对象。这样,如果我以后需要处理日志,它将采用结构良好的格式。

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,
};

用法:

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

输出:

info.log文件:

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

控制台:

info:    app is running on port 3001

答案 8 :(得分:0)

另一种解决方案是将记录器包装到一个文件中,该文件可以导出一些函数,例如logger.info(),logger.error()等。然后,您只需传递一个额外的密钥即可在每个消息日志中发送。

loggerService.js

const logger = winston.createLogger({ ... })

function handleLog(message, level) {
  const logData = {
    timestamp: Date.now(),
    message,
  }

  return logger[level](logData)
}

function info(message) {
  handleLog(message, 'info')
}

function error(message) {
  handleLog(message, 'error')
}

function warn(message) {
  handleLog(message, 'warn')
}

module.exports = {
  info,
  error,
  warn
}

whatever-file.js

const logger = require('./services/loggerService')

logger.info('Hello World!')

your-log.log

{"timestamp":"2019-08-21 06:42:27","message":"Hello World!","level":"info"}