# 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,调整配置里的日志级别,可以看到运行效果。