I. 基准代码( 五 )


XI. 日志 把日志当作事件流
日志使得应用程序运行的动作变得透明 。在基于服务器的环境中,日志通常被写在硬盘的一个文件里,但这只是一种输出格式 。
日志应该是事件流的汇总,将所有运行中进程和后端服务的输出流按照时间顺序收集起来 。(事件溯源模式?)尽管在回溯问题时可能需要看很多行,日志最原始的格式确实是一个事件一行 。日志没有确定开始和结束,但随着应用在运行会持续的增加 。
12-应用本身从不考虑存储自己的输出流 。不应该试图去写或者管理日志文件 。相反,每一个运行的进程都会直接的标准输出()事件流 。开发环境中,开发人员可以通过这些数据流,实时在终端看到应用的活动 。
在预发布或线上部署中,每个进程的输出流由运行环境截获,并将其他输出流整理在一起,然后一并发送给一个或多个最终的处理程序,用于查看或是长期存档 。这些存档路径对于应用来说不可见也不可配置,而是完全交给程序的运行环境管理 。类似和的开源工具可以达到这个目的 。
这些事件流可以输出至文件,或者在终端实时观察 。最重要的,输出流可以发送到这样的日志索引及分析系统,或/Hive这样的通用数据存储系统 。这些系统为查看应用的历史活动提供了强大而灵活的功能,包括:
XII. 管理进程 后台管理任务当作一次性进程运行
进程构成( )是指用来处理应用的常规业务(比如处理 web 请求)的一组进程 。与此不同,开发人员经常希望执行一些管理或维护应用的一次性任务,例如:
一次性管理进程应该和正常的常驻进程使用同样的环境 。这些管理进程和任何其他的进程一样使用相同的代码和配置,基于某个发布版本运行 。后台管理代码应该随其他应用程序代码一起发布,从而避免同步问题 。
所有进程类型应该使用同样的依赖隔离技术 。例如,如果Ruby的web进程使用了命令 exec thin start,那么数据库移植应使用 exec rake db: 。同样的,如果一个程序使用了,则需要在运行Web 服务器和任何.py管理进程时引入bin/ 。
12- 尤其青睐那些提供了 REPL shell 的语言,因为那会让运行一次性脚本变得简单 。在本地部署中,开发人员直接在命令行使用 shell 命令调用一次性管理进程 。在线上部署中,开发人员依旧可以使用ssh或是运行环境提供的其他机制来运行这样的进程 。