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

kol*_*rie 86 logging node.js winston

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

小智 108

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

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

  1. 删除控制台传输,然后使用timestamp选项再次添加.
  2. 使用timestamp选项设置为true创建自己的Logger对象.

首先:

var winston = require('winston');
winston.remove(winston.transports.Console);
winston.add(winston.transports.Console, {'timestamp':true});
Run Code Online (Sandbox Code Playgroud)

第二个,更清洁的选择:

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

可以在此处找到控制台传输的其他一些选项:

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

  • 这在新版本中不再起作用. (10认同)
  • 这很棒.我通常将它包装在一个专用文件中,以便我可以轻松地从任何文件中获取配置的记录器,即,我将上面的代码(选项2)放在一个新文件logger.js中,然后是module.exports = logger; 然后从任何文件我做var logger = require('./ logger.js'),然后可以从任何文件执行logger.info('hello')并获得相同的Winston配置. (7认同)
  • 这似乎不适用于当前版本的 Winston。请尝试其他答案之一。 (3认同)

小智 47

以上答案对我不起作用.如果您尝试使用最新版本的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'})
        ]
    });
Run Code Online (Sandbox Code Playgroud)

我用'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"}
Run Code Online (Sandbox Code Playgroud)

我们可以像往常一样在'format.combine()'中添加格式到这个时间戳:

format.timestamp({format:'MM-YY-DD'})
Run Code Online (Sandbox Code Playgroud)

  • 请注意,“format.timestamp”**必须**位于“format.json”之前(如果您使用后者) (9认同)

KTU*_*KTU 9

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

forever start -ao log/out.log server.js
Run Code Online (Sandbox Code Playgroud)

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

server.js

var util = require('util');
util.log("something with timestamp");
Run Code Online (Sandbox Code Playgroud)

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

out.log

15 Mar 15:09:28 - something with timestamp
Run Code Online (Sandbox Code Playgroud)


Bis*_*dev 8

我们也可以这样做

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;
Run Code Online (Sandbox Code Playgroud)

  • 我能够通过使用以下 printf 语句 `${info.timestamp} [${info.level.toUpperCase()}]: ${info.message} ${JSON.stringify(info)} 来包含 `someObject` `. 它包括我想我可以删除的级别、时间戳和消息。 (2认同)

Ste*_*eve 7

我接受了 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,
};
Run Code Online (Sandbox Code Playgroud)

用法:

app.listen(port, () => logger.info(`app is running on port ${port}`));
Run Code Online (Sandbox Code Playgroud)

输出:

信息.日志文件:

{"t":"2020-08-06 08:02:05","l":"info","m":"app is running on port 3001","s":""},
Run Code Online (Sandbox Code Playgroud)

安慰:

info:    app is running on port 3001
Run Code Online (Sandbox Code Playgroud)


Tam*_*mil 5

尽管我不知道Winston,但这是一个建议。我使用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'
Run Code Online (Sandbox Code Playgroud)

开发是我的节点进程的环境,[INFO | FATAL]是日志级别

在log4js中可以维护不同的配置文件以进行日志记录。我有开发和生产资料。也有记录器类型,例如滚动文件附加器,控制台附加器等。作为附加组件,您的日志文件将根据日志级别为五颜六色[Trace,Info,Debug,Error,Fatal];)

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