最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

ExpressJS:在每个Log语句中包含会话ID

IT培训 admin 5浏览 0评论

ExpressJS:在每个Log语句中包含会话ID

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

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

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

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

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

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

回答如下:

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

来自传入请求的req对象是特定于请求的对象,该对象将具有当前请求的状态(包括会话信息)。在node.js中真的没有其他办法可以做。正如您似乎已经知道的那样,由于node.js的共享单线程体系结构,没有像特定于请求的全局变量这样的东西,你可以放置一些你可以从任何地方访问的东西,它会告诉你你的会话重新服务。

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

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

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

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

你没有遗漏任何东西。

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

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


使这个可能或成立的可能关键在于如何构建代码,在相当低的级别提供哪些对象,这样您就可以找出可以将会话信息附加到哪个对象,使其可以在您需要的地方访问。这不是一般的解决方案,但取决于代码的确切布局和结构,因此如果没有看到您想到的具体代码,除了“将会话信息传递到您需要的位置”之外,我们无法提供更具体的建议。它”。

ExpressJS:在每个Log语句中包含会话ID

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

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

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

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

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

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

回答如下:

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

来自传入请求的req对象是特定于请求的对象,该对象将具有当前请求的状态(包括会话信息)。在node.js中真的没有其他办法可以做。正如您似乎已经知道的那样,由于node.js的共享单线程体系结构,没有像特定于请求的全局变量这样的东西,你可以放置一些你可以从任何地方访问的东西,它会告诉你你的会话重新服务。

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

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

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

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

你没有遗漏任何东西。

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

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


使这个可能或成立的可能关键在于如何构建代码,在相当低的级别提供哪些对象,这样您就可以找出可以将会话信息附加到哪个对象,使其可以在您需要的地方访问。这不是一般的解决方案,但取决于代码的确切布局和结构,因此如果没有看到您想到的具体代码,除了“将会话信息传递到您需要的位置”之外,我们无法提供更具体的建议。它”。

发布评论

评论列表 (0)

  1. 暂无评论