日志是软件系统的可观测性数据的最常见的媒介之一。通过日志,我们可以做很多事情:查问题、业务数据统计分析、告警监控等。这类系统,通常被称为日志平台或日志分析系统。它们的流程通常是:日志接入/采集 —> 日志清洗 —> 日志分析聚合(option) —> 日志存储 —> 日志查询。
其中,日志清洗的定义:指通过切分、静态 Join 等操作,将日志数据转化为标准 Key-Value(KV)格式的过程。
笔者看完这个定义后,大脑就浮现一个想法:如果日志一开始就是标准的KV格式,那么,是不是就可以把日志清洗流程省下来了?
事实上,过去2个月,我们的确这么干了。我们把所有的SpringBoot应用的日志都改成了JSON格式。而且对JSON中的Key进行了规范。将来,我们还会制定一个日志规范,以规范其它语言的应用的日志。这样进一步扩大日志结构化所带来的好处。
通过这种方式,我们节约了以下成本:
1. 日志清洗的程序的开发、运行、维护费用。
2. 日志的解析成本:程序员随意打日志,数据工程师只能被动的分析。
3. 查询日志的认知成本:过去是通过grep命令进行查询,现在通过SQL的方式查询。
当然,结构化日志本身也有成本:
1. 对历史日志的改造。这部分笔者认为可以看场景而定。
2. 开发人员的打日志习惯的改变成本,比如培训成本。
3. 日志框架本身的实现成本。我们就基于logback-stash实现了自己的日志框架(只是进行了很轻的封装)。
结构化日志本身的成本,比起日志清洗成本,根本不算什么。
本文只是简单介绍了日志非结构化与结构化之间的成本差异。
下一篇介绍基于SpringBoot的实践经验。