如何login – 十二因素的应用方式

我想知道logging我的节点应用程序背后的最佳实践。 我在https://12factor.net/logs上阅读了12个因子的应用指南,它指出日志应该总是被发送到stdout 。 很酷,但是那么如何pipe理生产中的日志呢? 有没有一个应用程序可以获取发送到stdout任何内容? 另外,build议我只loggingstdout而不是stderr ? 对于这个问题,我会很感激。

我认为明确地说“[web]应用程序应该将日志写入stdout ”是一个错误。

相反,我会build议:

a)专业品质,健壮的networking应用程序应该日志

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

c)理想情况下,logging器实现可以configuration为将stdout,stderr,文件,date标记文件,旋转文件,严重性级别过滤等等写入适当的位置。

我强烈认为,硬编码的标准输出,没有任何干预“logging”抽象,是穷人的做法。

这里有一篇很好的文章:

https://blog.risingstack.com/node-js-logging-tutorial/

有没有一个应用程序可以获取发送到stdout任何内容?

链接的页面提供了一些日志pipe理工具的例子,但是最简单的版本只是将应用程序的输出redirect到一个文件。 所以在bash node app.js > app.out 。 你也可以像node app.js 2> app.err 1> app.out一样分割stdoutstderr

你还可以有一些从这个文件中收集日志的服务,然后把它们索引到其他地方去search。

build议仅logging到stdout的想法是让环境控制如何处理日志,因为应用程序不一定知道它将最终运行的环境。 此外,将所有日志视为一个事件stream,您可以select将该stream视为环境。 例如,您可能希望将日志stream直接发送到日志聚合服务,或者您可能希望先对其进行预处理,然后将结果传输到其他位置。 如果您要求特定的输出(如login到文件),则会降低服务的可移植性。

12个因素指导方针的两个主要目标是“适合部署在现代云平台上”,并提供“执行环境之间的最大可移植性”。 在您的实例上可能有临时存储的云平台上,或者运行相同服务的许多实例上,您可能希望将日志汇总到某个中央存储中。 通过提供日志stream,您可以将其留给环境来协调如何执行此操作。 如果你直接把它们放到一个文件中,那么你必须定制你的环境到每个应用程序决定放置日志的地方,然后将它们redirect到中央存储。 因此,使用stdout来logging日志主要是一个有用的约定。