### 把日志当作事件流
*日志* 使得应用程序运行的动作变得透明。在基于服务器的环境中,日志通常被写在硬盘的一个文件里,但这只是一种输出格式。
日志应该是 [事件流](http://adam.heroku.com/past/2011/4/1/logs_are_streams_not_files/) 的汇总,将所有运行中进程和后端服务的输出流按照时间顺序收集起来。尽管在回溯问题时可能需要看很多行,日志最原始的格式确实是一个事件一行。日志没有确定开始和结束,但随着应用在运行会持续的增加。
**12-factor应用本身从不考虑存储自己的输出流。** 不应该试图去写或者管理日志文件。相反,每一个运行的进程都会直接的标准输出(`stdout`)事件流。开发环境中,开发人员可以通过这些数据流,实时在终端看到应用的活动。
在预发布或线上部署中,每个进程的输出流由运行环境截获,并将其他输出流整理在一起,然后一并发送给一个或多个最终的处理程序,用于查看或是长期存档。这些存档路径对于应用来说不可见也不可配置,而是完全交给程序的运行环境管理。类似[Logplex](https://github.com/heroku/logplex) 和 [Fluent](https://github.com/fluent/fluentd) 的开源工具可以达到这个目的。
这些事件流可以输出至文件,或者在终端实时观察。最重要的,输出流可以发送到 [Splunk](http://www.splunk.com/) 这样的日志索引及分析系统,或[Hadoop/Hive](http://hive.apache.org/) 这样的通用数据存储系统。这些系统为查看应用的历史活动提供了强大而灵活的功能,包括:
* 找出过去一段时间特殊的事件。
* 图形化一个大规模的趋势,比如每分钟的请求量。
* 根据用户定义的条件实时触发警报,比如每分钟的报错超过某个警戒线。