node.js - ExpressJS : Include Session ID in every Log statement

标签 node.js express logging

我目前在我的一个项目中使用 Express 4 和 Node 8。我希望能够记录应用程序中发生的某些事情,并将 session ID 作为将日志链链接在一起的方式。我正在使用 winston 进行日志记录。

问题:如何从应用程序的任何位置访问此 session ID,以便将其包含在日志中?

我知道您不能只将 session ID 设置为全局变量,因为传入的后续请求将覆盖设置的任何内容。

此外,我知道可以将 session ID 从路由层向下传递到所有其他需要它的函数,但是当最深层的函数只需要 session ID 来进行日志记录时,这可能会相当麻烦。

对于多线程应用程序,每个线程都可以有自己的内存池,这样它就可以安全地在全局范围内存放一个日志关联 ID,而不会受到其他请求的干扰。然而,由于 Node 是单线程的,这似乎是不可能的,除非我遗漏了什么。

有没有办法拥有一个特定于请求的全局池,或者是否有更好的方法在每条日志语句中包含一个相关 ID?

最佳答案

The Question: How can I access this session ID from anywhere in the app so that it can be included in logs?

来自传入请求的 req 对象是特定于请求的对象,它将具有当前请求的状态(包括 session 信息)。在 node.js 中确实没有其他方法可以做事。正如您似乎已经知道的那样,由于 node.js 的共享单线程架构,没有诸如特定于请求的全局变量之类的东西,您可以在其中放置可以从任何地方访问的东西,它会告诉您您的 session 是什么重新上菜。

如果您想要访问 session 状态,那么您必须将 req 对象或 session 状态本身传递到您想要记录它的级别。真的没有另一种做事的方法。

I understand that you can't just set the session id to a global variable since incoming subsequent requests will override whatever is set.

正确。尝试将任何特定于请求的状态放在全局空间中只会导致它经常被几个不同请求交错工作的协作事件处理所破坏。

For multithreaded applications, each thread can have its own memory pool so that it can safely house a logging correlation id globally without interference from other requests. However, since Node is single-threaded, this does not seem to be possible, unless I am missing something.

你没有遗漏任何东西。

Is there a way to have a request-specific global pool, or perhaps is there a better way to include a correlation id in every log statement that is made?

不,没有。您只需传递 req 对象或将特定于 session 的状态传递到您想要记录的级别。没有特定于请求的全局池。 node.js 不会在任何给定时间维护关于哪个请求有代码运行的某种状态。您可能已经知道,一个请求可以开始处理,然后在等待某个异步操作时将控制权返回给系统,另一个请求开始处理,然后当那个请求在等待某个异步操作时返回控制权时,前者获得一个事件并开始执行代码。当后续的异步事件导致为请求服务的新代码再次执行时,堆栈再次为空(上面没有特定于请求的状态)。


使这成为可能或站得住脚的关键可能与代码的结构有关,哪些对象在相当低的级别上可用,这样您就可以弄清楚可以将 session 信息附加到哪些对象,从而使其可以在您所在的位置访问需要它。这不是一个通用的解决方案,而是取决于代码的确切布局和结构,因此在没有看到您想要的具体代码的情况下,除了“将 session 信息传递到您需要的地方”之外,我们无法提供更具体的建议它”。

关于node.js - ExpressJS : Include Session ID in every Log statement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47584374/

相关文章:

angularjs - 从 Mongoose 模式中获取关注者

javascript - 如何修复 body-parser 不解析 express NodeJS 中的 html 表单日期输入字段?

java - 未找到 WildFly 9.0.1 WFLYCTL0158 处理程序 "CONSOLE"

angular - 如何处理 HttpClient 请求的日志记录?

java - Android tcp套接字设置etimedout值

mysql - Express 通过请求体发送数据但请求方法是 GET?

javascript - 如何将数组从 html 发送到 node.js,然后再发送到 mongodb?

javascript - 使用node.js调用同一目录中的文件时出错

javascript - 转换为 ObjectId 失败 : Mean Stack

java - 生成自定义记录器