我想在日志中添加时间戳。
实现这一目标的最佳方法是什么?
谢谢。
上面的答案对我不起作用。如果您尝试使用最新版本的 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 中添加了格式化选项,而不是在每个传输中添加了格式化选项。我在控制台和文件(活动.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'})
我自己也在处理同样的问题。 我有两种方法可以做到这一点。
包含 Winston 时,它通常默认为添加控制台传输。 为了使时间戳在这种默认情况下起作用,我需要:
- 删除控制台传输,然后使用时间戳选项再次添加。
- 创建您自己的 Logger 对象,并将时间戳选项设置为 true。
第一个:
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})
]
});
控制台传输的其他一些选项可在此处找到:
- 级别
- :此传输应记录的消息级别(默认为"调试")。
- silent:指示是否抑制输出的布尔标志(默认为 false)。
- colorize:布尔标志,指示我们是否应该着色输出(默认为 false)。
- timestamp:布尔标志,指示我们是否应该在输出前面加上时间戳(默认为 false)。如果指定了函数,则将使用其返回值而不是时间戳。
我们也可以这样做
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;
您可以使用内置的实用程序和永久使用timetap为您的nodejs服务器实现日志记录。启动服务器时,将日志输出添加为参数的一部分:
forever start -ao log/out.log server.js
然后你可以在你的服务器中写 util.js
服务器.js
var util = require('util');
util.log("something with timestamp");
输出将如下所示.log文件:
出.log
15 Mar 15:09:28 - something with timestamp
我接受了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}`));
输出:
信息.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
虽然我不知道温斯顿,但这是一个建议。我使用 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'
开发是我的节点进程的环境&[INFO|致命]是日志级别
在 log4js 中可以维护不同的日志记录配置文件。我有开发和生产配置文件。还有记录器类型,如滚动文件追加器、控制台追加器等。作为插件,您的日志文件将根据日志级别 [跟踪、信息、调试、错误、致命] ;)丰富多彩
log4js 将覆盖您的控制台.log 它现在是一个可配置的参数 0.5+
我们可以使用控制台戳将时间戳和日志级别添加到现有控制台:require('console-stamp')(console, '[yyyy-mm-dd HH:MM:ss.l]')
有关详细信息,请参阅 https://github.com/starak/node-console-stamp
有时默认时间戳格式对您来说可能不方便。您可以使用您的实现覆盖它。
而不是
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
另一种解决方案是将记录器包装到一个文件中,该文件导出一些函数,如 logger.info(),logger.error()等,然后您只需在每个消息日志上传递一个额外的密钥即可发送。
记录器服务.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
}
随便什么文件.js
const logger = require('./services/loggerService')
logger.info('Hello World!')
您的日志.log
{"timestamp":"2019-08-21 06:42:27","message":"Hello World!","level":"info"}