如何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”抽象,是穷人的做法。
这里有一篇很好的文章:
有没有一个应用程序可以获取发送到
stdout
任何内容?
链接的页面提供了一些日志pipe理工具的例子,但是最简单的版本只是将应用程序的输出redirect到一个文件。 所以在bash node app.js > app.out
。 你也可以像node app.js 2> app.err 1> app.out
一样分割stdout
和stderr
。
你还可以有一些从这个文件中收集日志的服务,然后把它们索引到其他地方去search。
build议仅logging到stdout
的想法是让环境控制如何处理日志,因为应用程序不一定知道它将最终运行的环境。 此外,将所有日志视为一个事件stream,您可以select将该stream视为环境。 例如,您可能希望将日志stream直接发送到日志聚合服务,或者您可能希望先对其进行预处理,然后将结果传输到其他位置。 如果您要求特定的输出(如login到文件),则会降低服务的可移植性。
12个因素指导方针的两个主要目标是“适合部署在现代云平台上”,并提供“执行环境之间的最大可移植性”。 在您的实例上可能有临时存储的云平台上,或者运行相同服务的许多实例上,您可能希望将日志汇总到某个中央存储中。 通过提供日志stream,您可以将其留给环境来协调如何执行此操作。 如果你直接把它们放到一个文件中,那么你必须定制你的环境到每个应用程序决定放置日志的地方,然后将它们redirect到中央存储。 因此,使用stdout
来logging日志主要是一个有用的约定。