日志是应用可观测的重要组成部分。可以说,任何运行在生产环境的应用,可能还没建立起指标(Metrics)体系,也或许还没上一套完整的追踪(Traces)方案,但是一定会打日志,至少是关键生命周期日志和错误日志。否则,一旦应用出现问题,几乎无从着手排查。
早在 2014 年底,Rust 生态就出现了官方的 log 库。这个库主要提供了打日志的宏指令定义,日志结构体的实现,以及打日志的 trait 接口。不过,它并没有提供实际日志如何打印的实现,而是将具体的日志输出方案留待社群扩展。应该说,log 库的定位跟 Java 生态里的 SLF4J 是一样的。
我猜测在 Rust lib teams 的设想当中,Rust 开源生态里应该很快会出现像 Java 生态当中的 Log4j 或 Logback 一样的日志实现,补充这部分空白,从而为所有 Rust 开发者提供一个完整的日志解决方案。
可惜,整整十年过去,Rust 生态虽然有像 env_logger
这样方便快速上手的 log
生态的日志实现,但是却迟迟没有一个能够满足生产环境下复杂配置需求和扩展需求的实现。
Log 生态的实现
可以看到,上图中属于可扩展日志框架的实现,只有包括 Logforth 在内的四个。其中 spdlog-rs 甚至是在 Logforth 之后才收录到这个名单的。也就是说,在 Logforth 之前,Rust 生态只有 fern 和 log4rs 两个选择,而这两个选择又各自有明显的问题以至于很难再生产环境中大范围使用。具体问题在后续章节我会介绍。
于是,Rust 生态的日志方案发生了 slog 和 tracing 两次歧出。其中 slog 已经不再迭代,甚至 README 里就推荐用户转向 tracing 库。而 tracing 的种种问题,在上一篇文章里我们已经充分看到了。
Logforth 的出现弥补了 log
生态中可靠、可扩展日志实现的空白。本文从介绍 Logforth 的核心 API 和使用方式出发,分享 Logforth 的设计理念,以及开发并开源 Logforth 背后的故事。最后,讨论 Logforth 未来需要做的工作,以及相关的开源逸闻。