12 Factor 方法论合并知识图谱 / 分组目录 / 12 Factor App 体系 / 日志

日志

App 体系进阶方法原则GA · 12 Factor App 体系

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

相关边

实践资源 · 源码引用

路径说明
08-source/app-content-en/logs.mdXI. Logs 原文:事件流/无缓冲 stdout/执行环境路由/Logplex/Fluentd/Splunk/Hadoop-Hive
08-source/app-content-en/concurrency.md进程管理器管理输出流的交叉引用
08-source/app-deploy/web.rb实例:Sinatra 应用的 stdout/错误输出作为事件流来源