Nodejs winston 会话 ID 记录
Nodejs winston session id logging
我将 winston 与 node & express 一起使用,但找不到合适的方法来简单地使用 express session.id 来增加所有日志条目(通过广泛的 google & SO 搜索)- 任何建议?
对于 Express 请求日志,您可以这样做:
var morgan = require('morgan'),
winston = require('winston');
// Define a new format token
morgan.token('id', function(req, res) {
return req.session ? req.session.id : 'N/A';
});
// Create a stream using Winston for logging
var winstonStream = {
write: function(msg, encoding) {
winston.info(msg);
}
};
// Create a logger middleware that uses the new token in format
// and writes to Winston logging stream
var expressLogger = morgan(morgan.combined + ' - :id', { stream: winstonStream });
app.use(expressLogger);
不知道如何为每个 winston[level]()
调用实现相同的效果,因为您确实需要手头有请求对象(除了将对象传递给每一位代码)。
感谢您的回答 vesse,不过我需要它比那更笼统一些 - 即。无论我在哪里调用 winston,不仅仅是 morgan 请求日志记录。我已经覆盖了 winston.log,所以我可以调用 log.info(req, message) 或 log.warn 等,会话 ID 从请求传递到元信息。我也在使用 cookie-session,它不会为我创建会话 ID,所以我的解决方案是:
var CustomLogger = function(options){
CustomLogger.super_.apply(this, arguments);
}
util.inherits(CustomLogger, winston.Logger);
CustomLogger.prototype.log = function () {
var args = Array.prototype.slice.call(arguments);
var req = args[1];
if (req.session) {
req.session.id = req.session.id || uuid.v4();
var meta = _.merge((args[3] || {}), {sessionId: req.session.id});
CustomLogger.super_.prototype.log.call(this, args[0], args[2] + ' | ', meta);
}
else {
// no req.session, assume req hasnt been passed in as 1st param
CustomLogger.super_.prototype.log.apply(this, arguments);
}
}
var logger = new CustomLogger({
transports: [ ... ],
exitOnError: false
});
我将 winston 与 node & express 一起使用,但找不到合适的方法来简单地使用 express session.id 来增加所有日志条目(通过广泛的 google & SO 搜索)- 任何建议?
对于 Express 请求日志,您可以这样做:
var morgan = require('morgan'),
winston = require('winston');
// Define a new format token
morgan.token('id', function(req, res) {
return req.session ? req.session.id : 'N/A';
});
// Create a stream using Winston for logging
var winstonStream = {
write: function(msg, encoding) {
winston.info(msg);
}
};
// Create a logger middleware that uses the new token in format
// and writes to Winston logging stream
var expressLogger = morgan(morgan.combined + ' - :id', { stream: winstonStream });
app.use(expressLogger);
不知道如何为每个 winston[level]()
调用实现相同的效果,因为您确实需要手头有请求对象(除了将对象传递给每一位代码)。
感谢您的回答 vesse,不过我需要它比那更笼统一些 - 即。无论我在哪里调用 winston,不仅仅是 morgan 请求日志记录。我已经覆盖了 winston.log,所以我可以调用 log.info(req, message) 或 log.warn 等,会话 ID 从请求传递到元信息。我也在使用 cookie-session,它不会为我创建会话 ID,所以我的解决方案是:
var CustomLogger = function(options){
CustomLogger.super_.apply(this, arguments);
}
util.inherits(CustomLogger, winston.Logger);
CustomLogger.prototype.log = function () {
var args = Array.prototype.slice.call(arguments);
var req = args[1];
if (req.session) {
req.session.id = req.session.id || uuid.v4();
var meta = _.merge((args[3] || {}), {sessionId: req.session.id});
CustomLogger.super_.prototype.log.call(this, args[0], args[2] + ' | ', meta);
}
else {
// no req.session, assume req hasnt been passed in as 1st param
CustomLogger.super_.prototype.log.apply(this, arguments);
}
}
var logger = new CustomLogger({
transports: [ ... ],
exitOnError: false
});