Aur*_*ide 5 logging node.js express
我目前在我的一个项目中使用 Express 4 和 Node 8。我希望能够记录应用程序中发生的某些事情,并让会话 ID 作为将日志链链接在一起的方式。我正在使用温斯顿进行日志记录。
问题:如何从应用程序中的任何位置访问此会话 ID,以便将其包含在日志中?
我知道您不能只将会话 ID 设置为全局变量,因为传入的后续请求将覆盖所有设置。
此外,我知道可以将会话 id 从路由层传递到所有其他需要它的功能,但是当最深级别的功能仅需要会话 id 进行日志记录时,这可能会相当麻烦。
对于多线程应用程序,每个线程都可以拥有自己的内存池,以便它可以安全地全局保存日志记录相关 ID,而不会受到其他请求的干扰。然而,由于 Node 是单线程的,这似乎不可能,除非我遗漏了一些东西。
有没有一种方法可以拥有一个特定于请求的全局池,或者是否有更好的方法可以在每个日志语句中包含相关 ID?
问题:如何从应用程序中的任何位置访问此会话 ID,以便将其包含在日志中?
传入请求中的对象req是特定于请求的对象,它将具有当前请求的状态(包括会话信息)。在 Node.js 中确实没有其他方法可以做事。正如您似乎已经知道的那样,由于 Node.js 的共享、单线程架构,不存在诸如特定于请求的全局变量之类的东西,您可以在其中放置可以从任何地方访问的内容,并且它会告诉您您正在哪个会话重新服务。
如果您想要访问会话状态,那么您必须将req对象或会话状态本身传递到您想要记录它的级别。确实没有其他方法可以做事。
我知道您不能只将会话 ID 设置为全局变量,因为传入的后续请求将覆盖所有设置。
正确的。尝试将任何特定于请求的状态放入全局空间中只会导致它经常被几个不同请求的协作事件处理所践踏,这些请求交错工作。
对于多线程应用程序,每个线程都可以拥有自己的内存池,以便它可以安全地全局保存日志记录相关 ID,而不会受到其他请求的干扰。然而,由于 Node 是单线程的,这似乎不可能,除非我遗漏了一些东西。
你没有遗漏任何东西。
有没有一种方法可以拥有一个特定于请求的全局池,或者是否有更好的方法可以在每个日志语句中包含相关 ID?
不,那里没有。您只需传递req对象或将特定于会话的状态传递到您想要记录的级别。没有特定于请求的全局池。Node.js 不会在任何给定时间维护有关哪个请求有代码运行的某种状态。您可能已经知道,一个请求可以开始处理,然后在等待某些异步操作时将控制权返回给系统,另一个请求开始处理,然后当该请求在等待某些异步操作时返回控制时,前者会获取一个事件并开始执行代码。当后续异步事件导致再次执行请求服务的新代码时,堆栈再次为空(堆栈上没有特定于请求的状态)。
使这一点成为可能或成立的可能关键与代码的结构方式有关,哪些对象在相当低的级别上可用,以便您可以找出可以将会话信息附加到哪些对象,以便在需要时可以访问它。这不是一个通用的解决方案,而是取决于代码的确切布局和结构,因此在没有看到您想要的具体代码的情况下,除了“将会话信息传递到您需要的位置”之外,我们无法提供更具体的建议它”。
| 归档时间: |
|
| 查看次数: |
2041 次 |
| 最近记录: |