node.js express自定义格式调试日志记录

node.js express自定义格式调试日志记录,node.js,logging,express,Node.js,Logging,Express,这是一个看似简单的问题,但我不确定node.js是否与我习惯的node.js相同(比如来自Python或LAMP),我实际上认为可能没有 问题陈述:我想在我的express应用程序中使用基本、简单的日志记录。也许我想输出调试消息,或信息消息,或只是一些统计数据到日志中,供其他后端系统稍后使用 1) 但是,我希望所有消息日志都包含一些字段:例如,远程ip和请求url 2) 另一方面,记录的代码在我的应用程序中无处不在,包括调用树的深处 3) 我不想将(req,res)向下传递到调用树中的每个节点(

这是一个看似简单的问题,但我不确定node.js是否与我习惯的node.js相同(比如来自Python或LAMP),我实际上认为可能没有

问题陈述:我想在我的express应用程序中使用基本、简单的日志记录。也许我想输出调试消息,或信息消息,或只是一些统计数据到日志中,供其他后端系统稍后使用

1) 但是,我希望所有消息日志都包含一些字段:例如,远程ip和请求url

2) 另一方面,记录的代码在我的应用程序中无处不在,包括调用树的深处

3) 我不想将
(req,res)
向下传递到调用树中的每个节点(这只会在最不需要的地方创建大量参数传递,并使我的代码复杂化,因为我需要将它们传递到异步回调和超时等)

在其他系统中,如果每个请求有一个线程,我将把(req,res)对(我需要的所有数据都在这里)存储在一个线程本地存储器中,记录器将读取该线程并格式化消息

在节点中,只有一个线程。我的选择是什么?什么是“运行特定代码段的请求上下文”

我能想到的实现这一点的唯一方法是查看跟踪,并使用反射查看调用树上的局部变量。我讨厌这样,而且需要为所有回调、setTimeout、setInterval、新函数()和eval等实现这一点。。。这一清单还在继续


其他人在做什么?

您知道函数中定义的任何函数都共享外部函数的变量吗?因此,您可以将前导存储到请求处理程序中的日志消息中,并且该请求处理程序中定义的所有回调都可以引用您定义的前导变量。是的,但是从a中调用但未在a中定义的函数b呢?那么回调呢?还有暂停?(还有在运行时构造的函数或eval代码中构造的不太常见的情况,上帝禁止吗?)。显式地将
(req,res)
传递给我调用的几乎每个函数(因为谁知道呢,它可能会调用需要使用日志记录的其他函数)。我希望有更好的方法将运行的代码与它所代表的请求关联起来。我在我的原始帖子中提出了一些建议,但我认为仅仅为了日志记录而编写太麻烦了。您的回调函数可以定义为处理请求时实例化的对象的一部分。然后,他们可以引用
和序言的对象成员。