日志

1 Example

ego版本:ego@v0.5.3

2 日志配置

框架在处理的日志区分为框架日志和业务日志,了解日志,请阅读日志和错误处理。

日志配置的数据结构如下

  1. // Config ...
  2. type Config struct {
  3. Debug bool // 是否双写至文件控制日志输出到终端
  4. Level string // 日志初始等级,默认info级别
  5. Dir string // [fileWriter]日志输出目录,默认logs
  6. Name string // [fileWriter]日志文件名称,默认框架日志ego.sys,业务日志default.log
  7. MaxSize int // [fileWriter]日志输出文件最大长度,超过改值则截断,默认500M
  8. MaxAge int // [fileWriter]日志存储最大时间,默认最大保存天数为7天
  9. MaxBackup int // [fileWriter]日志存储最大数量,默认最大保存文件个数为10个
  10. RotateInterval time.Duration // [fileWriter]日志轮转时间,默认1天
  11. EnableAddCaller bool // 是否添加调用者信息,默认不加调用者信息
  12. EnableAsync bool // 是否异步,默认异步
  13. FlushBufferSize int // 缓冲大小,默认256 * 1024B
  14. FlushBufferInterval time.Duration // 缓冲时间,默认5秒
  15. Writer string // 使用哪种Writer,可选[file|ali|stderr],默认file
  16. AliAccessKeyID string // [aliWriter]阿里云sls AKID,必填
  17. AliAccessKeySecret string // [aliWriter]阿里云sls AKSecret,必填
  18. AliEndpoint string // [aliWriter]阿里云sls endpoint,必填
  19. AliProject string // [aliWriter]阿里云sls Project名称,必填
  20. AliLogstore string // [aliWriter]阿里云sls logstore名称,必填
  21. AliAPIBulkSize int // [aliWriter]阿里云sls API单次请求发送最大日志条数,最少256条,默认256条
  22. AliAPITimeout time.Duration // [aliWriter]阿里云sls API接口超时,默认3秒
  23. AliAPIRetryCount int // [aliWriter]阿里云sls API接口重试次数,默认3次
  24. AliAPIRetryWaitTime time.Duration // [aliWriter]阿里云sls API接口重试默认等待间隔,默认1秒
  25. AliAPIRetryMaxWaitTime time.Duration // [aliWriter]阿里云sls API接口重试最大等待间隔,默认3秒
  26. AliAPIMaxIdleConnsPerHost int // [aliWriter]阿里云sls 单个Host HTTP最大空闲连接数,应当大于AliApiMaxIdleConns
  27. AliAPIMaxIdleConns int // [aliWriter]阿里云sls HTTP最大空闲连接数
  28. AliAPIIdleConnTimeout time.Duration // [aliWriter]阿里云sls HTTP空闲连接保活时间
  29. }

3 终端显示日志

在运行程序前开启环境变量 EGO_DEBUG=true,可以把所有日志输出到终端。并且开启了该指令后,日志的时间变成 time.Time 数据结构。

  1. package main
  2. import (
  3. "github.com/gotomicro/ego"
  4. "github.com/gotomicro/ego/core/elog"
  5. )
  6. // export EGO_DEBUG=true && go run main.go
  7. func main() {
  8. err := ego.New().Invoker(func() error {
  9. elog.Info("logger info", elog.String("gopher", "ego"), elog.String("type", "command"))
  10. return nil
  11. }).Run()
  12. if err != nil {
  13. elog.Panic("startup", elog.Any("err", err))
  14. }
  15. }

4 文件显示日志

EGO_DEBUG 环境变量不存在或者EGO_DEBUG=false的时候,日志默认输出到 logs 目录下。

  1. package main
  2. import (
  3. "github.com/gotomicro/ego"
  4. "github.com/gotomicro/ego/core/elog"
  5. )
  6. // export EGO_DEBUG=false && go run main.go
  7. func main() {
  8. err := ego.New().Invoker(func() error {
  9. elog.Info("logger info", elog.String("gopher", "ego"), elog.String("type", "command"))
  10. return nil
  11. }).Run()
  12. if err != nil {
  13. elog.Panic("startup", elog.Any("err", err))
  14. }
  15. }

5 动态日志级别

框架里自带的框架日志和业务日志都默认支持动态更改日志级别。当程序启动后,你可以在配置文件里更改lv的级别从info改为debug,就可以看到动态生效的debug日志,该方法非常利于研发排查线上问题,倡导大家线下多打debug日志,线上用info级别日志,出现线上问题可以改变日志级别,快速排查问题。

  1. [logger.default]
  2. level = "info"
  1. package main
  2. import (
  3. "github.com/gotomicro/ego"
  4. "github.com/gotomicro/ego/core/elog"
  5. "time"
  6. )
  7. // export EGO_DEBUG=true && go run main.go --config=config.toml
  8. func main() {
  9. err := ego.New(ego.WithHang(true)).Invoker(func() error {
  10. go func() {
  11. for {
  12. elog.Info("logger info", elog.String("gopher", "ego1"), elog.String("type", "file"))
  13. elog.Debug("logger debug", elog.String("gopher", "ego2"), elog.String("type", "file"))
  14. time.Sleep(1 * time.Second)
  15. }
  16. }()
  17. return nil
  18. }).Run()
  19. if err != nil {
  20. elog.Panic("startup", elog.Any("err", err))
  21. }
  22. }

6 正式环境Panic日志和终端输出高亮

我们在使用k8s的时候,如果遇到Panic情况,会将panic记录到日志信息,同时也将panic信息高亮输出到终端,方便快速定位

  • 命令行高亮输出

img.png

  • 日志输出

img_1.png

7 日志字段

EGO的字段是确定类型的,通过正交查询方式,减少索引字段个数,同时方便创建索引。后续字段类型尽量像opentrace日志 - 图9 (opens new window)靠拢

名称类型描述
lvstring日志级别
tsstring时间戳
msgstring日志信息
appstring应用名称
iidstring应用实例id
tidstring请求trace id
colorstring染色
compstring类库或组件。如 “grpc”, “http”, “redis”.
compNamestring组件配置key作为唯一标识
addrstring依赖的实例名称。以mysql为例,”dsn = “root:root@tcp(127.0.0.1:3306)/ego?charset=utf8”,addr为 “127.0.0.1:3306”.
costint耗时时间
codeint用户侧响应的状态码
methstring对于redis是command、对于http是url、对于mysql是sql
hoststring主机名
ipstring主机IP
peerAppstring对端应用名称
peerHoststring对端主机名
errKindstring错误类型,用于收敛
errstring错误信息

日志

  • 慢日志
  • 错误日志