概要
单体服务的日志打印比较简单,因为一条请求的所有流程都在单体服务中。相反,一条请求在微服务系统中会经历若干服务,在任何一个服务中都可能出现问题,因此记录的错误原因会分散到不同的地方。
我们可以使用ELK来收集日志,将其存放在es或者hive中,这样方便查询。
本文主要介绍日志在微服务系统中的标准格式。
流程图
TraceId与SpanId
一条请求涉及的所有日志是通过TraceId来表示标识其唯一性的。
SpanId能提供如下作用:1、该服务在请求中的调用层级;2、调用顺序
关于这两个字段的解释可以参见-- TraceId 和 SpanId 生成规则 - 金融分布式架构 SOFAStack - 阿里云
字段
公共字段
| 字段名 | 解释 |
| level | 日志的级别,通常包括trace, info, error, fatal |
| Time | 时间,如果存在机房跨不同时域需要统一时间标准 |
| function | 打印日志对应的函数 |
| Line | 打印日志对应的代码行数 |
| TraceId | 见上 |
| SpanId | 见上 |
| Caller | 调用方 |
| Hint | 是否是压测流量 |
| Method | http的url,rpc的service.method |
| Params | http的params和body, rpc的形参 |
Req_in
| 字段名 | 解释 |
| From_ip | 请求来源 |
| Proto | 协议,对于同时支持多种协议的服务比较重要 |
| Caller_info | 调用方带的信息,比如user_agent, content_type |
Req_out
| 字段名 | 解释 |
| From_ip | 请求来源 |
| code | 返回码 |
| Msg | 返回消息 |
| Proc_time | 处理时间 |
Call_in
| 字段名 | 解释 |
| cspanid | 确定下游的spanid |
| Tag | 对下游服务进行分类,如mysql,redis,http |
| Location | 调用位置信息 |
Req_out
| 字段名 | 解释 |
| cspanid | 确定下游的spanid |
| code | 返回码 |
| Msg | 返回消息 |
| Proc_time | 处理时间 |



