What · 是什么
将日志视为事件流,不关心存储格式
日志提供运行中应用行为的可见性;服务器环境通常写入磁盘文件(logfile),但 logfile 只是众多输出格式之一。
日志是从所有运行进程与 backing service 输出流收集的、聚合且按时间排序的事件流,来源多元。
原始日志典型为每行一个事件的文本格式(异常 backtrace 可能跨多行),没有固定起点或终点,应用运行期间持续流动。
十二要素应用绝不过问其输出流的路由或存储,不应尝试写或管理 logfile,职责交给环境,这让日志处理保持简单、可扩展。
每个运行进程把事件流无缓冲地写到 stdout,保证实时性与完整性,是应用可观测性的统一来源,日志的聚合、检索与告警因此都能规模化实现。
本地开发中开发者在前台终端查看该流以观察应用行为,调试直观,使日志处理职责与业务代码彻底分离,为历史回溯与趋势分析提供了完整素材。
staging/生产部署中每个进程的流被运行环境捕获,与应用所有其他流合并,路由到一个或多个最终目的地供查看与长期归档。
归档目的地对应用不可见、不可配置,完全由执行环境管理,应用无感知,运行环境可自由扩展日志能力而不影响应用。
开源日志路由器有 Logplex 与 Fluentd,可完成聚合与转发,事件流模型天然支持流式分析与实时告警。
事件流可路由到文件、终端实时 tail,或送往日志索引分析系统 Splunk、通用数据仓库 Hadoop/Hive。
日志系统能力:查找过去特定事件、大规模趋势图表(如每分钟请求数)、按用户定义启发式主动告警(如每分钟错误数超阈值告警)。
Why · 为什么
原理 · Principle
日志提供运行可见性,是调试、监控与审计的原始素材,故障定位基石,这让日志处理保持简单、可扩展,是应用可观测性的统一来源。
logfile 只是输出格式之一,路由/存储应由执行环境统一负责,应用保持简单,日志的聚合、检索与告警因此都能规模化实现。
聚合事件流使历史检索、趋势分析与主动告警成为可能,可观测性强,使日志处理职责与业务代码彻底分离,为历史回溯与趋势分析提供了完整素材。
How · 怎么做
进程把事件流无缓冲写到 stdout,不过问路由/存储,保持输出纯净,这让日志处理保持简单、可扩展。
本地开发在前台终端查看事件流观察行为,实时反馈,是应用可观测性的统一来源,日志的聚合、检索与告警因此都能规模化实现。
staging/生产由执行环境捕获、合并、路由到目的地(文件/实时 tail/日志分析/数据仓库)。
用 Logplex/Fluentd 做开源日志路由,聚合全部进程流,使日志处理职责与业务代码彻底分离。
事件流送 Splunk(日志索引分析)或 Hadoop/Hive(通用数据仓库)做历史检索/趋势/告警。
案例 · Cases
| 代表性案例 |
|---|
| Logplex:Heroku 开源日志路由器,聚合多进程流,这让日志处理保持简单、可扩展,是应用可观测性的统一来源。 |
| Fluentd:开源日志收集与路由工具,广泛集成,日志的聚合、检索与告警因此都能规模化实现,使日志处理职责与业务代码彻底分离。 |
| Splunk:日志索引与分析系统,支持复杂检索,为历史回溯与趋势分析提供了完整素材,运行环境可自由扩展日志能力而不影响应用。 |
| Hadoop/Hive:通用数据仓库,支持大规模趋势与历史检索,事件流模型天然支持流式分析与实时告警。 |
| 实时 tail 终端查看;每分钟请求数趋势图;错误数超阈值触发告警,从机制上避免日志丢失与格式碎片化。 |
反模式 · Anti-patterns
- 应用写/管理 logfile——路由存储应交给执行环境,应用保持简单,这让日志处理保持简单、可扩展。
- 应用关心输出流的路由与归档目的地,越界负责基础设施,是应用可观测性的统一来源,日志的聚合、检索与告警因此都能规模化实现。
- 把日志视为文件而非事件流,失去聚合与流式分析能力,使日志处理职责与业务代码彻底分离,为历史回溯与趋势分析提供了完整素材。
实践资源 · 源码引用
| 路径 | 说明 |
|---|---|
| 08-source/app-content-en/logs.md | XI. Logs 原文:事件流/无缓冲 stdout/执行环境路由/Logplex/Fluentd/Splunk/Hadoop-Hive |
| 08-source/app-content-en/concurrency.md | 进程管理器管理输出流的交叉引用 |
| 08-source/app-deploy/web.rb | 实例:Sinatra 应用的 stdout/错误输出作为事件流来源 |