node.js - NodeJS Express - 全局唯一请求 ID

标签 node.js express logging winston

是否可以在不将记录器交给每个方法/函数调用的情况下定义包含在每个日志语句中的唯一请求 ID?

使用的技术:NodeJS、Express、Winston

最佳答案

已编辑

最后,我创建了一个可以完成所有工作的库。 https://github.com/davicente/express-logger-unique-req-id

它是 Winston 库的包装器,因此您可以以相同的方式使用它。

如果对你有帮助,请告诉我


我们在几个项目中都遇到了同样的问题,我找不到任何完整的解决方案。我们使用相同的技术(Node.js、Express.js 和 Winston 用于日志) 我使用几个库和包装 Winston 库找到了一个解决方案: - node-uuid 用于为每个请求创建唯一标识符 - continuation-local-storage 用于在不同模块之间共享此 ID,而无需在所有调用中发送 req 对象。

首先,我需要为每个请求创建和设置唯一标识符。我在中间件中做:

var uuid = require('node-uuid');
var createNamespace = require('continuation-local-storage').createNamespace;
var myRequest = createNamespace('my request');

// Run the context for each request. Assign a unique identifier to each request
app.use(function(req, res, next) {
    myRequest.run(function() {
        myRequest.set('reqId', uuid.v1());
        next();
    });
});

之后我不得不包装 Winston 库,从上下文中恢复 id 并添加到日志的消息中:

var winston = require('winston');
var getNamespace = require('continuation-local-storage').getNamespace;

// Wrap Winston logger to print reqId in each log
var formatMessage = function(message) {
    var myRequest = getNamespace('my request');
    message = myRequest && myRequest.get('reqId') ? message + " reqId: " + myRequest.get('reqId') : message;
    return message;
};

var logger = {
    log: function(level, message) {
        winstonLogger.log(level, formatMessage(message));
    },
    error: function(message) {
        winstonLogger.error(formatMessage(message));
    },
    warn: function(message) {
        winstonLogger.warn(formatMessage(message));
    },
    verbose: function(message) {
        winstonLogger.verbose(formatMessage(message));
    },
    info: function(message) {
        winstonLogger.info(formatMessage(message));
    },
    debug: function(message) {
        winstonLogger.debug(formatMessage(message));
    },
    silly: function(message) {
        winstonLogger.silly(formatMessage(message));
    }
};
module.exports = logger;

我觉得这有点复杂,所以我决定把它写在一个帖子里。您可以从那里获得更多信息:Express.js: Logging info with global unique request ID – Node.js

我希望这对您的问题有所帮助。

关于node.js - NodeJS Express - 全局唯一请求 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36875701/

相关文章:

node.js - 如何获取mongoose/mongodb中数组中除了我们传递的元素之外的元素?

node.js - super 账本结构中的链码事件存在漏洞

java - 如何在 wildfly-8.2.0.Final 的自定义文件夹位置生成 server.log

javascript - 在node.js中设置很多路由

node.js - 为 Google App Engine Standard 使用私有(private) npm 注册表

node.js - 为什么我在测试中收到 401 响应?

javascript - 使用多个路由时,使用express和chokidar进行热重载会导致http header 发送错误

javascript - 当响应完成时,我应该在快速响应(流)对象中处理哪些事件?

java - 检测参数字符串的代码行

postgresql - macOS 上的 PostgreSQL 日志在哪里?