Node.js 如何记录-12因素应用方式

Node.js 如何记录-12因素应用方式,node.js,express,logging,Node.js,Express,Logging,我想知道记录节点应用程序背后的最佳实践。我正在阅读12因素应用程序指南,其中指出日志应始终发送到stdout。很酷,但是在生产环境中如何管理日志呢?是否有一个应用程序可以收集发送到标准输出的任何内容?此外,是否建议我只登录到stdout,而不登录到stderr?我希望能对此事有一个看法 是否有一个应用程序可以收集发送到标准输出的任何内容 您链接到的页面提供了一些日志管理工具的示例,但最简单的版本是将应用程序的输出重定向到文件。所以在bashnode app.js>app.out中。您还可以将st

我想知道记录节点应用程序背后的最佳实践。我正在阅读12因素应用程序指南,其中指出日志应始终发送到
stdout
。很酷,但是在生产环境中如何管理日志呢?是否有一个应用程序可以收集发送到标准输出的任何内容?此外,是否建议我只登录到
stdout
,而不登录到
stderr
?我希望能对此事有一个看法

是否有一个应用程序可以收集发送到标准输出的任何内容

您链接到的页面提供了一些日志管理工具的示例,但最简单的版本是将应用程序的输出重定向到文件。所以在bash
node app.js>app.out
中。您还可以将
stdout
stderr
node app.js 2>app.err 1>app.out一样拆分

另外,您还可以使用某种服务,从该文件收集日志,然后将它们编入索引以便在其他地方搜索

建议只登录到
stdout
的想法是让环境控制如何处理日志,因为应用程序不一定知道它最终将在其中运行的环境。此外,通过将所有日志视为事件流,您可以将如何处理该流的选择权留给环境。例如,您可能希望将日志流直接发送到日志聚合服务,或者您可能希望首先对其进行预处理,然后将结果流到其他地方。如果您强制执行特定的输出(如记录到文件),则会降低服务的可移植性


12要素指南的两个主要目标是“适合在现代云平台上部署”,并提供“执行环境之间的最大可移植性”。在云平台上,您的实例上可能有临时存储,或者许多实例运行相同的服务,您可能希望将日志聚合到某个中央存储中。通过提供日志流,您可以让环境来协调如何执行此操作。如果将日志直接放入文件中,则必须根据每个应用程序决定放置日志的位置调整环境,以便将日志重定向到中央存储。因此,对日志使用
stdout
主要是一种有用的约定

我认为断然说“[web]应用程序应该将日志写入
stdout
”是错误的

相反,我建议:

a) 专业质量、健壮的web应用程序应该有日志

b) 应用程序应将“日志”视为抽象的“流”对象

c) 理想情况下,记录器实现可配置为写入标准输出、标准输出、文件、带日期戳的文件、旋转文件、按严重性级别过滤等(视情况而定)

我强烈认为,在没有任何“记录器”抽象干预的情况下,硬编码写入标准输出是一种糟糕的做法

这是一篇好文章:

很酷,但是在生产环境中如何管理日志呢

原木水槽就是你要找的

是否有一个应用程序可以收集发送到stdout的内容

是的,不是。这是木船。它可以是一个应用程序,但实际上只是执行或运行时环境中的某个进程,而您的应用程序并不真正了解它

另一种看待这一点的方式是关注点分离。正如在另一个回答中所说的,它是关于让环境拥有发生在日志上的事情,并且只希望应用程序自己关心发出日志事件。我认为12FA文档中缺少的是,他们没有尝试为您完成这个难题,因为对于从标准输出到哪里会有不同的意见,所以我将根据我的个人经验和我在整个云空间中看到的情况添加这些缺少的部分

记录器将日志事件发送到日志流(也称为“日志”) 不用说,应用程序应该有某种“logger”抽象,但这实际上只是向stdout发送日志事件的入口点。该抽象的职责是以所需的格式将日志事件放到日志流(stdout)中,然后完成应用程序的职责。事实上,12FA文档到此结束

12因素应用程序是关于创建云友好和可移植的应用程序,所以你必须假设你甚至不知道执行/运行时环境是什么。所以我们不知道什么是“环境”,这就是重点。因此,从这里开始,执行/运行时环境负责处理流并将其移动到接收器

日志船实现日志流到日志接收器 因此,我们现在解决这个问题的方法是为stdout流提供某种侦听器,它将获取输出并将其发送到下游的日志接收器

“ship”可能是环境或运行时中的某个东西,也可能是运行应用程序后台的某个东西(流侦听器);它可能是其他一些定制过程;甚至可能是卡夫卡。关键是它应该是应用程序中一个独立的“类”,而应用程序并不真正了解它。它只是监听流并将其发送到水槽。在某些解决方案中,这是您需要构建的,在其他解决方案中,它由您的平台处理。简单地说,“我如何让水流进入水槽?”

“水槽”是目的地。这可以是控制台(您好,它实际上是一个流阅读器),它可以是文件,也可以是Splunk、应用程序洞察、堆栈驱动程序等。有简单的解决方案,也有更大更复杂的企业解决方案,但概念保持不变

简而言之,这就是你问题的答案,如果w