【问题标题】:ExpressJS: Include Session ID in every Log statementExpressJS:在每个日志语句中包含会话 ID
【发布时间】:2018-05-15 00:38:35
【问题描述】:

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

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

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

此外,我知道可以将会话 id 从路由层向下传递给所有其他需要它的函数,但是当最深层次的函数需要会话 id 仅用于日志记录时,这可能会相当麻烦。

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

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

【问题讨论】:

    标签: node.js express logging


    【解决方案1】:

    我也遇到了同样的问题,经过一番大研究,我终于找到了解决它的方法。 我在这个问题中解释过:NodeJS Express - Global Unique Request Id 但基本上我使用了 2 个库: - node-uuid:为每个请求生成唯一的 id - continuation-local-storage:与需要它的不同模块共享 id。

    我在这篇文章中用一个完整的代码示例记录了所有这些信息: https://solidgeargroup.com/express-logging-global-unique-request-identificator-nodejs

    就我而言,由于我使用 Winston 进行日志记录,因此该示例是使用此库制作的,但它可以与任何其他库一起使用。

    【讨论】:

      【解决方案2】:

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

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

      如果您想访问会话状态,则必须将req 对象或会话状态本身向下传递到您要记录它的级别。真的没有其他方法可以做事。

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

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

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

      你没有错过任何东西。

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

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


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

      【讨论】:

        猜你喜欢
        • 2019-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 2016-10-31
        • 2013-12-11
        相关资源
        最近更新 更多