Node.js 中的每个请求日志记录

2024-04-01

我是一位经验丰富的 Java 开发人员,开始学习 Node.js 并转向异步模型。除了日志记录之外,大多数事情都进展顺利。在使用 Express 在 Node.js 中进行开发时,我在 Java 中找不到类似于 log4j 和 NDC 的任何内容。

我的目标是让每个日志语句自动添加以下信息:

[2013-11-07 11:17:04.615 serverScript 信息 7036 192.168.7.209]

这包括时间戳、编写此语句的 js 文件的名称(对于模块化节点应用程序)、调试级别、进程 ID(正在运行的集群)以及客户端的 IP 地址。

我可以让它在最初进入我的请求处理程序时写入这些内容,但是如果不将一堆参数传播到每个被调用的函数,子例程内的记录器语句就没有信息。我知道我可以在每个 js 文件中创建一个记录器实例来初始化其名称,但我还没有找到客户端 IP 地址的解决方案。对于运行时间较长的请求,当下一个请求到来时,我在记录器中设置的地址会被覆盖,因此记录的 IP 会发生交叉。

我看过温斯顿,但即使使用它也无法解决这个问题。有人实现过这个吗?当您可以按 IP 过滤以仅查看一个用户的活动时,跟踪字段问题非常有用。

[编辑:从参数传递解决方案进行测试,直到我学习系统日志方式]

[2013-11-07 14:29:28.641 server INFO  7527 192.168.7.209] Got request from 192.168.7.209 for /ionmed/executeQuery?
[2013-11-07 14:29:28.641 router INFO  7527 192.168.7.209] About to route a request for /ionmed/executeQuery, method=POST
[2013-11-07 14:29:28.642 router INFO  7527 192.168.7.209] getting POSTed data
[2013-11-07 14:29:28.642 router INFO  7527 192.168.7.209] POST params: {"sqlQuery":"select sleep(10)","sessionStart":"1383852558799","rand":"0.5510970998368581","jsessionid":"117DBAA89F599D923AF80D4AB171BDDF"}
[2013-11-07 14:29:28.642 requestHandlers INFO  7527 192.168.7.209] 'query' was called.
[2013-11-07 14:29:28.642 requestHandlers INFO  7527 192.168.7.209] select sleep(10)
[2013-11-07 14:29:30.673 server INFO  7527 192.168.7.217] Got request from 192.168.7.217 for /
[2013-11-07 14:29:30.673 router INFO  7527 192.168.7.217] About to route a request for /, method=GET
[2013-11-07 14:29:30.673 router INFO  7527 192.168.7.217] No request handler found for /; serving as file
[2013-11-07 14:29:30.673 router INFO  7527 192.168.7.217] Request handler 'serveFile' was called to get: /index.html
[192.168.7.217 Thu, 07 Nov 2013 19:29:30 GMT] HTTP/1.1 GET "/node/" 200 "Mozilla/5.0 (iPod; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3"
[2013-11-07 14:29:33.578 server INFO  7527 192.168.7.217] Got request from 192.168.7.217 for /
[2013-11-07 14:29:33.578 router INFO  7527 192.168.7.217] About to route a request for /, method=GET
[2013-11-07 14:29:33.578 router INFO  7527 192.168.7.217] No request handler found for /; serving as file
[2013-11-07 14:29:33.579 router INFO  7527 192.168.7.217] Request handler 'serveFile' was called to get: /index.html
[192.168.7.217 Thu, 07 Nov 2013 19:29:33 GMT] HTTP/1.1 GET "/node/" 200 "Mozilla/5.0 (iPod; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3"
[2013-11-07 14:29:38.644 requestHandlers INFO  7527 192.168.7.209] sending response
[192.168.7.209 Thu, 07 Nov 2013 19:29:38 GMT] HTTP/1.1 POST "/node/ionmed/executeQuery?" 200 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0"
[2013-11-07 14:29:41.540 server INFO  7527 192.168.7.217] Got request from 192.168.7.217 for /
[2013-11-07 14:29:41.541 router INFO  7527 192.168.7.217] About to route a request for /, method=GET
[2013-11-07 14:29:41.541 router INFO  7527 192.168.7.217] No request handler found for /; serving as file
[2013-11-07 14:29:41.541 router INFO  7527 192.168.7.217] Request handler 'serveFile' was called to get: /index.html
[192.168.7.217 Thu, 07 Nov 2013 19:29:41 GMT] HTTP/1.1 GET "/node/" 200 "Mozilla/5.0 (iPod; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3"
[2013-11-07 14:29:45.146 server INFO  7527 192.168.7.209] RLz6tmJ7KTH2R16VCVTX: bye {"user":"1"}
[2013-11-07 14:29:45.176 server INFO  7527 192.168.7.209] RLz6tmJ7KTH2R16VCVTX: disconnected

现在我只需要弄清楚如何使快速请求记录器与我的内部记录器采用相同的行条目格式,直到将其全部移至 rsyslog。


前段时间我也遇到了同样的问题,终于可以花一些时间研究它了。 @ibash 方法和他的帖子让我率先解决了我遇到的问题(感谢您的帮助)。我只多走了一些步骤,以便在日志中自动打印每个请求的唯一 ID。 根据您的情况,您可以使用相同的方法添加源和目标 IP 以及每个请求所需的所有信息,并在所有日志中自动打印。

我的做法: - 正如 @ibash 所解释的,我使用 continuation-local-storage 在每个请求的所有模块之间共享信息。因此,我为每个请求生成一个唯一的 ID,并将其存储在使用该库创建的命名空间中 - 我包装了 Winston 库(以一种非常简单的方式),以便从共享的命名空间中恢复信息,并覆盖我使用的所有 Winston 方法,将唯一的 Id 添加到字符串中。显然,在您的情况下,您应该添加您需要的所有信息以及您之前存储在库的命名空间中的信息。

由于这个问题有点复杂,无法向不熟悉所有这些事情的人解释,我将其写在一篇文章中,并附有一个清晰的示例,您可以根据需要重复使用。温斯顿包裹可能非常有用:Express.js:使用全局唯一请求 ID 记录信息 – Node.js https://solidgeargroup.com/express-logging-global-unique-request-identificator-nodejs

我希望你可以重用我的代码,也许将来 Express 会为此实现一个解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js 中的每个请求日志记录 的相关文章

随机推荐

  • ant 构建过程中代码修改的最佳实践

    承认 这听起来完全不像最佳实践 但让我解释一下 在构建过程中 我们需要将内部版本号和系统版本粘贴到一个类中 该类的唯一目的是包含这些值并使其可访问 我们的第一个想法是使用系统属性 但由于部署环境的波动性 另一种说法是 系统管理员正在做奇怪
  • PHP CURL 库中的curl --resolve 等效项

    是否有等效的curl resolve 在 PHP CURL 库中 背景 我有循环 DNS 一个域名解析为多个 IP 并且我想将请求发送到specific主持人 我使用基于 apache 名称的虚拟主机 因此 HTTP 请求中必须出现正确的域
  • 相机 2 CameraCharacteristics 似乎显示不正确的数据

    我已经下载并更改了 Google 的相机 2 基本版 https github com googlesamples android Camera2Basic例子 我的更改增加了对相机设备的迭代并显示了它们的一些特征 我创建了这个函数 pri
  • UIView 与 UIViewController

    好吧 我对 iPhone 开发真的很陌生 而且我已经了解了很多知识 我只需要帮助决定如何将这 4 6 张图片编程到我的项目中 我基本上想制作一本漫画书 用户能够从一张图片滑动到另一张图片 所有这些图片应该在 UIVIEW 还是 UIView
  • 为什么JSP文件不能超过64k

    当我编写 JSP 文件时 我收到错误 它不应超过 64 KB 然后我将代码分解到不同的文件 现在代码正在工作 为什么 JSP 存在这个限制 Java 对方法的大小有 64k 的限制 因此 当 jsp 转换为 jspService 方法时 如
  • 您知道针对多种编程语言的快速参考指南吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在我的工作过程中 我维护多种编程语言的代码 如下所列 由于我还没有掌握其中的大部分内容 所以我一直忘记
  • GitHub 中的相关拉取请求是否可行?

    目前我正在处理一个非常大的拉取请求 为了以某种方式保持代码审查的可管理性 我们的想法是将完整的拉取请求分割成相互依赖的独立部分 一个例子是 拉取请求 1 创建接口 接口 A 和 B 并重构代码 拉取请求 2 接口 A 实现和测试 取决于拉取
  • 水平滚动图像列表

    我正在尝试创建一个水平滚动列表 当启用 Javascript 时 我将用一个奇特的版本替换它 但我希望标记和 css 在相当现代的浏览器上没有 Javascript 的情况下看起来和工作正常 任何以任何方式使用 Javascript 的建议
  • ADFS 2016、MVC 和 WEB.API 令牌和声明

    我目前正在开发一个带有 Web API 后端的 Net MVC 应用程序 这两个应用程序都使用 ADFS 2016 进行身份验证 Web API 本身按预期工作 但是我在 MVC 应用程序本身的 ADFS 配置方面遇到一些问题 基于本指南h
  • WP7 XNA 显示 3D FBX 模型

    我只是初学者 很抱歉我的愚蠢问题 我的模型看起来像这样 http img265 imageshack us img265 8291 clipboard01ap jpg http img265 imageshack us img265 829
  • 在 Python 3 中重新打开关闭的 stringIO 对象

    因此 我创建一个 StringIO 对象来将字符串视为文件 gt gt gt a Me you and them n gt gt gt import io gt gt gt f io StringIO a gt gt gt f read 1
  • 以编程方式退出应用程序的适当方法是什么?

    I am evaluating user inputs as commands for my application If the user presses Q or q and then hits enter the applicatio
  • 收到“无法检查可用内存”。在 Oracle DB 18c 上

    我正在尝试创建一个数据库以完成我的自学 但不幸的是我遇到了意外错误 无法检查可用内存 我正在使用数据库配置助手 DBCA 来完成此操作 我的Oracle数据库版本 添加以下参数来绕过错误 dbca J Doracle assistants
  • 加载图像停止问题

    我有窗户形式 我已经放入了一张加载图像PictureBox 当我加载表单时 我已经设置了 PictureBox1 Visible false 当我触发我设置的按钮的单击事件时 PictureBox1 Visible true 但在这种情况下
  • 静态常量和常量有什么区别?

    有什么区别static const and const 例如 static const int a 5 const int i 5 他们之间有什么区别吗 你什么时候会使用其中一种而不是另一种 static确定函数外部的可见性或内部变量的生命
  • JavaScript 对象的长度

    我有一个 JavaScript 对象 是否有内置或公认的最佳实践方法来获取该对象的长度 const myObject new Object myObject firstname Gareth myObject lastname Simpso
  • Firefox 11 调试器中的 firebug 1.9.1 不起作用

    当我激活脚本面板时 它显示 调试器未激活 但我无法在调试器上使 firebug 中断 或在断点处 我已经重新安装了插件 将其重置为默认设置 删除了 Firefox 配置文件 重新启动计算机 没有任何作用 这个版本一直有效 同样的事情也发生在
  • 使用Luigi,如何读取PostgreSQL数据,然后将这些数据传递到工作流程中的下一个任务?

    Using Luigi https github com spotify luigi 我想定义一个具有两个 阶段 的工作流程 第一个从 PostgreSQL 读取数据 第二个对数据做了一些事情 因此我从子类化开始luigi contrib
  • AttributeError:尝试使用 writerow 时“str”对象没有属性“keys”

    尝试写一个pythonscraper that scrapes从网页到csv文件的数据 如果删除 dataFrameCleaned cleanDataUp dataFrame 行 也尝试改变我编写 python 文件的方式 csvData
  • Node.js 中的每个请求日志记录

    我是一位经验丰富的 Java 开发人员 开始学习 Node js 并转向异步模型 除了日志记录之外 大多数事情都进展顺利 在使用 Express 在 Node js 中进行开发时 我在 Java 中找不到类似于 log4j 和 NDC 的任