2017-08-26 104 views
1

我最近发现https://12factor.net/ - 生产环境的一组要求除了记录要求外,看起来相当明智。为什么在Factor12中登录日志?

https://12factor.net/logs说日志应该去STDOUT。 WAT?为什么?

我一直主要是管理过去7年,一定错过了什么。但我清楚地记得STDERR是为了达到这个确切目的而设计的 - 作为诊断信息的单独流。几十年来它一直被使用。

为什么打破惯例?

我确实记得所有默认的HTTP服务器都被配置为向浏览器(客户端)发送STDOUT并将STDERR发送到日志文件。它无处不在。对大多数环境来说,这是显而易见的和默认的我首先想到的是他们的12因子标准的作者犯了一个错误。

我错过了什么?为什么要将日志发送到STDOUT?

请不要告诉我,现代网络应用程序没有“正常输出”。首先,他们这样做,其次,这不能作为打破数十年工作的惯例的理由,并且仍然完全符合目的。

我很感激你的想法。谢谢。

回答

0

这是因为12-因素的应用程序,预计一些进程管理器的控制下运行为单独的进程 - 像supervisord或东西 - 管理路由应用程序输出,在它们实际上属于。

他们的想法是尽可能使应用程序不可知 - 以系统相关的方式处理所有应用程序的所有输出,同时隐藏应用程序中的所有应用程序。

于是,我想到了“12-因素”的反应将是您的应用程序应该推到STDOUT,并supervisord应该捕捉输出(与所有其他应用程序在同一台主机上运行的所有其他STDOUT小号一起)并重定向到STDERRsyslog或任何你需要的东西,在每个主机的基础上。

更新

我想12因子推荐守护进程的过程,但because reasons(PID和所有的)他们实际上没有。进一步的证据表明,12因素的流程管理者部分至关重要。

+0

你没有回答stdout的问题,因为stderr仍然可以被捕获并重定向到任何需要的地方。此外,如果您说“尽可能使应用程序不可知”,那么它们必须将它们的日志输入stderr,并将其输出提供给stdout,因为这是原始设计。如果你不了解你的环境,那么你只需遵循标准。这是最安全的方式。 –

+0

是的,我想我真的不知道*答案 - 希望Wiggins已经在某处解释过...我可以说Heroku从应用中捕获了STDOUT和STDERR,让您可以独立管理它们;因为** ** STDOUT'和'STDERR'都会丢失/无法访问(即在无法访问服务器的完全“云”环境中)。 – willoller

+0

昨天我已经通过电子邮件向Adam Wiggins发送了一封请求,并通过此页面的链接向其解释。 –

1

请记住,12factor主要应用于您的应用程序或称为您的“微服务”,而不是像Nginx,Apache,Cherokee等服务器,他们可以一如既往地登录,但您的应用程序是唯一的您可能想要扩展并将部署在分布式环境中,因此需要以不同方式处理。

关于日志记录,其主要思想是,以避免应用程序写入到磁盘,只写STDOUTSTDERR,正常的日志在“结构化日志记录”的格式,并通过像elastiksearch工具后收集/分析。这简化了检查日志的过程,以便在出现问题时不需要登录到每台服务器并检查发生了什么。

在许多情况下,当应用程序将日志写入磁盘时,如果日志轮换机制未正确配置,服务器磁盘可能会变满并且服务将被中断。

如果您正在寻找一位与12factor配合得很好的主管。

十二个因素的应用程序进程不应该守护或写入PID文件。相反,依靠操作系统的流程管理器(例如Upstart,云平台上的分布式流程管理器或开发中的Foreman等工具)来管理输出流,响应崩溃的流程并处理用户启动的重新启动和关闭。

检查immortal它可以结合STDOUT和STDERR或登录单独之外的情况下也让日志完好无时间戳是一种结构化的日志,后来可以通过弹性搜索中使用,或任何其他工具,例如:

cmd: microservice 
env: 
    DEBUG: 1 
    ENVIRONMENT: production 
log: 
    file: /var/log/app-1.log 
    age: 86400 # seconds 
    num: 7  # int 
    size: 1 # MegaBytes 
    timestamp: true # will add timesamp to log 

相同的服务,但与STDOUT和STDERR日志分离:

cmd: microservice 
env: 
    DEBUG: 1 
    ENVIRONMENT: production 
log: 
    file: /var/log/app-1.log 
    age: 86400 # seconds 
    num: 7  # int 
    size: 1 # MegaBytes 
stderr: 
    file: /var/log/app-error.log 
    age: 86400 # seconds 
    num: 7  # int 
    size: 1 # MegaBytes 
    timestamp: true # will add timesamp to log 

更多关于run.yml可以在这里找到:https://immortal.run/post/run.yml/

+0

谢谢,nbari,广告。你仍然没有回答这个问题。使用哪个服务器(如果有)来接收请求并不重要。 STDOUT和STDERR都可以完成相同的日志聚合。为什么打破使用STDERR进行日志记录的惯例? –

+0

事实上,通常情况下STDOUT和STDERR是结合在一起的,但是采用“结构化日志记录”格式,通常是JSON,以便稍后可以通过诸如elastiksearch等工具对单个输出文件进行分析和分析等,这是一种有助于维护和扩展应用程序的方法 – nbari