当前位置: 首页 > 面试题库 >

NodeJS Express-全局唯一请求ID

法镜
2023-03-14
问题内容

是否可以定义每个日志语句中包含的唯一请求ID,而无需将记录器交给每个方法/函数调用?

使用的技术:NodeJS,Express,Winston


问题答案:

已编辑

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

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

让我知道这是否对您有帮助

我们在多个项目中都遇到了同样的问题,但我找不到针对该问题的完整解决方案。我们使用相同的技术(Node.js,Express.js和Winston记录日志),我找到了一个解决方案,它使用了几个库并包装了Winston库:-node-
uuid,用于为每个请求创建唯一的标识符-continuation-local-用于在不同模块之间共享此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:使用全局唯一请求ID –
Node.js记录信息

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



 类似资料:
  • 唯一标识符 guid(length = 32, firstU = true, radix = 62) 该函数可以生产一个全局唯一、随机的guid,默认首字母为u,可以用于当做元素的id或者class名等需要唯一,随机字符串的地方,因为id或者class不能以数字开头。 length <Number | null> guid的长度,默认为32,如果取值null,则按rfc4122标准生成对应格式的随

  • 问题内容: 这个问题非常简单和技术性: 我要实现的是: 有没有办法做到这一点?如果不是,可以返回一个值应用于? 问题答案: 您期望的是 同步 ( 阻塞 )类型的请求。 默认情况下 ,请求是 异步的 ( 非阻塞 ),这意味着浏览器不会等待它们完成才能继续工作。这就是为什么您的警报得到错误结果的原因。 现在,您可以选择将请求设置为 sync ,这意味着脚本将仅在请求完成 后 继续运行。 该 建议的 方

  • 在上面的代码示例中,试图为每个请求生成唯一的txn-id。但是,观察到它正在重复使用相同的数字导致重复。我还尝试使用以下方法根据当前时间生成,当在1秒内触发超过1个请求时,它仍然会导致重复。 任何替代解决方案来为每个请求生成唯一ID,而不管并发情况如何? 提前感谢。

  • 本文向大家介绍谈一谈,id全局唯一且自增,如何实现?相关面试题,主要包含被问及谈一谈,id全局唯一且自增,如何实现?时的应答技巧和注意事项,需要的朋友参考一下 考察点:SnowFlake雪花算法 参考回答; SnowFlake雪花算法 雪花ID生成的是一个64位的二进制正整数,然后转换成10进制的数。64位二进制数由如下部分组成: snowflake id生成规则 1位标识符:始终是0,由于lon

  • 我用的是Spring Boot 2.5.4和Swagger 3。我在Swagger配置文件中添加了一个全局请求参数作为类型头,required=true。Swagger UI在所有API中正确地显示了所需的请求头,但问题是它允许在所需请求头的值为空时发送请求。在Swagger 2中,UI曾经禁止发送请求,直到值被填充。 任何建议。

  • 我知道Javascript,但对NodeJS非常陌生。我希望在代码中的任何位置,即server.js之外的位置,重用HTTP请求。请看一看: server.js