### 把日志當作事件流
*日志*?使得應用程序運行的動作變得透明。在基于服務器的環境中,日志通常被寫在硬盤的一個文件里,但這只是一種輸出格式。
日志應該是?[事件流](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/)?這樣的通用數據存儲系統。這些系統為查看應用的歷史活動提供了強大而靈活的功能,包括:
* 找出過去一段時間特殊的事件。
* 圖形化一個大規模的趨勢,比如每分鐘的請求量。
* 根據用戶定義的條件實時觸發警報,比如每分鐘的報錯超過某個警戒線。