2.3 日志

2.3.1 日志介绍

日志定义: 系统日志、框架日志、业务日志。系统日志采集应用的启动、运行、error、panic等信息。框架日志采集应用内部组件的启动、运行、error、panic、应用access、job等信息。业务日志采集业务相关信息。

日志性能

  • sugar版本
  • 高性能版本

日志级别

  • debug
  • info
  • warn
  • error
  • dpanic

日志字段

  • lv 日志级别
  • ts 时间戳
  • msg 日志信息
  • aid 应用id
  • iid 应用实例id
  • tid 请求trace id

2.3.2 配置规范

配置说明2.3 日志 - 图1

2.3.3 框架日志

我们规范了框架日志,定义了十多个字段用于收敛框架的日志行为。参考于opentrace2.3 日志 - 图2

名称类型描述
lvstring日志级别
tsstring时间戳
msgstring日志信息
aidstring应用id
iidstring应用实例id
tidstring请求trace id
colorstring染色
modstring类库或模块。如 “grpc”, “http”, “redis”.
addrstring依赖的实例名称。以mysql为例,“dsn = “root:juno@tcp(127.0.0.1:3306)/juno?charset=utf8”,addr为 “127.0.0.1:3306”.
costint耗时时间
codeint用户侧响应的状态码
methstring对于rediscommand、对于httpurl、对于mysqlsql
hoststring主机名
ipstring主机IP
peerAidstring对端应用id
peerHoststring对端主机名
errKindstring错误类型,用于收敛
errstring错误信息

定义合理的日志schema,我们可以将框架日志全部采集到一个logstore里进行分析和报警。如图所示 image image

因为开源时间紧迫,并未将内部收敛的迁移到开源项目中,二期我们将会把这些治理理念放入到框架中,尽情期待。

2.3.4 业务的命令行日志

参考日志终端展示示例2.3 日志 - 图5

  1. [jupiter.logger.default]
  2. debug = true # 是否在命令行输出
  3. enableConsole = true # 是否按命令行格式输出
  1. xlog.DefaultLogger = xlog.StdConfig("default").Build()
  2. for {
  3. xlog.Info("logger info", xlog.String("gopher", "jupiter"), xlog.String("type", "command"))
  4. time.Sleep(1 * time.Second)
  5. }

在线下调试代码的时候,我们可以开启debug=true的选项将日志信息输出到终端,并且打开enableConsole=true,就可以看到高亮的日志信息,更加方便我们排查日志。运行go run main.go --config=config.toml,可以看到以下运行结果。

todo 缺个图

2.3.5 业务的文本日志

参考日志终端展示示例2.3 日志 - 图6

  1. [jupiter.logger.default]
  2. debug = false # 是否在命令行输出
  3. enableConsole = false # 是否按命令行格式输出
  4. name = "default.json" # 日志名称
  5. dir = "." # 日志路径
  6. async = true # 默认异步采集日志
  1. xlog.DefaultLogger = xlog.StdConfig("default").Build()
  2. for {
  3. xlog.Info("logger info", xlog.String("gopher", "jupiter"), xlog.String("type", "command"))
  4. time.Sleep(1 * time.Second)
  5. }

上线的时候,我们可以关闭调试选项,将他们设置为debug=falseenableConsole=false,并设置日志路径dir和名称name。运行go run main.go --config=config.toml,可以看到运行结果。

2.3.6 动态修改日志级别

参考日志终端展示示例2.3 日志 - 图7

  1. [jupiter.logger.default]
  2. debug = false # 是否在命令行输出
  3. enableConsole = false # 是否按命令行格式输出
  4. name = "default.json" # 日志名称
  5. dir = "." # 日志路径
  6. async = true # 默认异步采集日志
  7. level = "info" # 调整日志级别,可以动态修改日志
  1. xlog.DefaultLogger = xlog.StdConfig("default").Build()
  2. for {
  3. xlog.Info("logger info", xlog.String("gopher", "jupiter"), xlog.String("type", "command"))
  4. xlog.Debug("logger debug", xlog.String("gopher", "jupiter"), xlog.String("type", "command"))
  5. time.Sleep(1 * time.Second)
  6. }

上线的时候,我们一般会开启info的日志级别,那么测试的debug日志是不会在线上记录。如果线上出现问题后,我们可以通过配置中心,修改这个级别,那么线上会立刻采集debug的日志。运行go run main.go --config=config.toml --watch=true,调整配置里的日志级别,可以看到运行效果。