# 2.3 日志
# 2.3.1 日志介绍
日志定义: 系统日志、框架日志、业务日志。系统日志采集应用的启动、运行、error、panic等信息。框架日志采集应用内部组件的启动、运行、error、panic、应用access、job等信息。业务日志采集业务相关信息。
# 日志性能
- sugar版本
- 高性能版本
# 日志级别
- debug
- info
- warn
- error
- panic
# 日志字段
- lv 日志级别
- ts 时间戳
- msg 日志信息
- aid 应用id
- iid 应用实例id
- tid 请求trace id
# 2.3.2 配置规范
# 2.3.3 框架日志
我们规范了框架日志,定义了十多个字段用于收敛框架的日志行为。参考于opentrace (opens new window)。
| 名称 | 类型 | 描述 | 
|---|---|---|
| lv | string | 日志级别 | 
| ts | string | 时间戳 | 
| msg | string | 日志信息 | 
| aid | string | 应用id | 
| iid | string | 应用实例id | 
| tid | string | 请求trace id | 
| color | string | 染色 | 
| mod | string | 类库或模块。如 "grpc","http","redis". | 
| addr | string | 依赖的实例名称。以mysql为例, "dsn = "root:juno@tcp(127.0.0.1:3306)/juno?charset=utf8",addr为"127.0.0.1:3306". | 
| cost | int | 耗时时间 | 
| code | int | 用户侧响应的状态码 | 
| meth | string | 对于 redis是command、对于http是url、对于mysql是sql | 
| host | string | 主机名 | 
| ip | string | 主机IP | 
| peerAid | string | 对端应用id | 
| peerHost | string | 对端主机名 | 
| errKind | string | 错误类型,用于收敛 | 
| err | string | 错误信息 | 
定义合理的日志schema,我们可以将框架日志全部采集到一个logstore里进行分析和报警。如图所示
 
 
因为开源时间紧迫,并未将内部收敛的迁移到开源项目中,二期我们将会把这些治理理念放入到框架中,尽情期待。
# 2.3.4 业务的命令行日志
[jupiter.logger.default]
    debug = true          # 是否在命令行输出
    enableConsole = true  # 是否按命令行格式输出
1
2
3
2
3
xlog.DefaultLogger = xlog.StdConfig("default").Build()
for {
    xlog.Info("logger info", xlog.String("gopher", "jupiter"), xlog.String("type", "command"))
    time.Sleep(1 * time.Second)
}
1
2
3
4
5
2
3
4
5
在线下调试代码的时候,我们可以开启debug=true的选项将日志信息输出到终端,并且打开enableConsole=true,就可以看到高亮的日志信息,更加方便我们排查日志。运行go run main.go --config=config.toml,可以看到以下运行结果。

# 2.3.5 业务的文本日志
[jupiter.logger.default]
    debug = false         # 是否在命令行输出
    enableConsole = false # 是否按命令行格式输出
    name = "default.json" # 日志名称
    dir = "."             # 日志路径
    async = true          # 默认异步采集日志
1
2
3
4
5
6
2
3
4
5
6
xlog.DefaultLogger = xlog.StdConfig("default").Build()
for {
    xlog.Info("logger info", xlog.String("gopher", "jupiter"), xlog.String("type", "command"))
    time.Sleep(1 * time.Second)
}
1
2
3
4
5
2
3
4
5
上线的时候,我们可以关闭调试选项,将他们设置为debug=false和enableConsole=false,并设置日志路径dir和名称name。运行go run main.go --config=config.toml,可以看到运行结果。
# 2.3.6 动态修改日志级别
参考动态修改日志级别示例 (opens new window)
[jupiter.logger.default]
    debug = false         # 是否在命令行输出
    enableConsole = false # 是否按命令行格式输出
    name = "default.json" # 日志名称
    dir = "."             # 日志路径
    async = true          # 默认异步采集日志
    level = "info"       # 调整日志级别,可以动态修改日志         
1
2
3
4
5
6
7
2
3
4
5
6
7
xlog.DefaultLogger = xlog.StdConfig("default").Build()
for {
    xlog.Info("logger info", xlog.String("gopher", "jupiter"), xlog.String("type", "command"))
    xlog.Debug("logger debug", xlog.String("gopher", "jupiter"), xlog.String("type", "command"))
    time.Sleep(1 * time.Second)
}
1
2
3
4
5
6
2
3
4
5
6
上线的时候,我们一般会开启info的日志级别,那么测试的debug日志是不会在线上记录。如果线上出现问题后,我们可以通过配置中心,修改这个级别,那么线上会立刻采集debug的日志。运行go run main.go --config=config.toml --watch=true,调整配置里的日志级别,可以看到运行效果。