使用示例

  1. var c logx.LogConf
  2. // 从 yaml 文件中 初始化配置
  3. conf.MustLoad("config.yaml", &c)
  4. // logx 根据配置初始化
  5. logx.MustSetup(c)
  6. logx.Info("This is info!")
  7. logx.Infof("This is %s!", "info")
  8. logx.Error("This is error!")
  9. logx.Errorf("this is %s!", "error")
  10. logx.Close()

初始化

logx 有很多可以配置项,可以参考 logx.LogConf 中的定义。目前可以使用

  1. logx.MustSetUp(c)

进行初始化配置,如果没有进行初始化配置,所有的配置将使用默认配置。

Level

logx 支持的打印日志级别有:

  • info
  • error
  • server
  • fatal
  • slow
  • stat

可以使用对应的方法打印出对应级别的日志。 同时为了方便调试,线上使用,可以动态调整日志打印级别,其中可以通过 logx.SetLevel(uint32) 进行级别设置,也可以通过配置初始化进行设置。目前支持的参数为:

  1. const (
  2. // 打印所有级别的日志
  3. InfoLevel = iotas
  4. // 打印 errors, slows, stacks 日志
  5. ErrorLevel
  6. // 仅打印 server 级别日志
  7. SevereLevel
  8. )

日志模式

目前日志打印模式主要分为2种,一种文件输出,一种控制台输出。推荐方式,当采用 k8sdocker 等部署方式的时候,可以将日志输出到控制台,使用日志收集器收集导入至 es 进行日志分析。如果是直接部署方式,可以采用文件输出方式,logx 会自动在指定文件目录创建对应 5 个对应级别的的日志文件保存日志。

  1. .
  2. ├── access.log
  3. ├── error.log
  4. ├── severe.log
  5. ├── slow.log
  6. └── stat.log

同时会按照自然日进行文件分割,当超过指定配置天数,会对日志文件进行自动删除,打包等操作。

禁用日志

如果不需要日志打印,可以使用 logx.Close() 关闭日志输出。注意,当禁用日志输出,将无法在次打开,具体可以参考 logx.RotateLoggerlogx.DailyRotateRule 的实现。

关闭日志

因为 logx 采用异步进行日志输出,如果没有正常关闭日志,可能会造成部分日志丢失的情况。必须在程序退出的地方关闭日志输出:

  1. logx.Close()

框架中 restzrpc 等大部分地方已经做好了日志配置和关闭相关操作,用户可以不用关心。 同时注意,当关闭日志输出之后,将无法在次打印日志了。

推荐写法:

  1. import "github.com/tal-tech/go-zero/core/proc"
  2. // grace close log
  3. proc.AddShutdownListener(func() {
  4. logx.Close()
  5. })

Duration

我们打印日志的时候可能需要打印耗时情况,可以使用 logx.WithDuration(time.Duration), 参考如下示例:

  1. startTime := timex.Now()
  2. // 数据库查询
  3. rows, err := conn.Query(q, args...)
  4. duration := timex.Since(startTime)
  5. if duration > slowThreshold {
  6. logx.WithDuration(duration).Slowf("[SQL] query: slowcall - %s", stmt)
  7. } else {
  8. logx.WithDuration(duration).Infof("sql query: %s", stmt)
  9. }

会输出如下格式

  1. {"@timestamp":"2020-09-12T01:22:55.552+08","level":"info","duration":"3.0ms","content":"sql query:..."}
  2. {"@timestamp":"2020-09-12T01:22:55.552+08","level":"slow","duration":"500ms","content":"[SQL] query: slowcall - ..."}

这样就可以很容易统计出慢 sql 相关信息。

TraceLog

tracingEntry 是为了链路追踪日志输出定制的。可以打印 context 中的 traceId spanId 信息,配合我们的 restzrpc 很容易完成链路日志的相关打印。示例如下

  1. logx.WithContext(context.Context).Info("This is info!")

SysLog

应用中可能有部分采用系统 log 进行日志打印,logx 同样封装方法,很容易将 log 相关的日志收集到 logx 中来。

  1. logx.CollectSysLog()

日志配置相关

LogConf 定义日志系统所需的基本配置
完整定义如下:

  1. type LogConf struct {
  2. ServiceName string `json:",optional"`
  3. Mode string `json:",default=console,options=console|file|volume"`
  4. Path string `json:",default=logs"`
  5. Level string `json:",default=info,options=info|error|severe"`
  6. Compress bool `json:",optional"`
  7. KeepDays int `json:",optional"`
  8. StackCooldownMillis int `json:",default=100"`
  9. }

Mode

Mode 定义了日志打印的方式。默认的模式是 console, 打印到控制台上面。
目前支持的模式如下:

  • console
    • 打印到控制台
  • file
    • 打印到指定路径下的access.log, error.log, stat.log等文件里
  • volume

    • 为了在k8s内打印到mount进来的存储上,因为多个pod可能会覆盖相同的文件,volume模式自动识别pod并按照pod分开写各自的日志文件


      Path

      Path 定义了文件日志的输出路径,默认值为 logs


      Level

      Level 定义了日志打印级别,默认值为 info。 目前支持的级别如下:
  • info

  • error
  • severe


    Compress

    Compress 定义了日志是否需要压缩,默认值为 false。在 Mode file 模式下面,文件最后会进行打包压缩成 .gz 文件。


    KeepDays

    KeepDays 定义日志最大保留天数,默认值为 0,表示不会删除旧的日志。在 Mode file 模式下面,如果超过了最大保留天数,旧的日志文件将会被删除。


    StackCooldownMillis

    StackCooldownMillis 定义了日志输出间隔,默认为 100 毫秒。

示例

  1. package main
  2. import (
  3. "time"
  4. "github.com/tal-tech/go-zero/core/logx"
  5. )
  6. func foo() {
  7. logx.WithDuration(time.Second).Error("world")
  8. }
  9. func main() {
  10. c := logx.LogConf{
  11. Mode: "console", //console|file|volume
  12. Path: "logs",
  13. }
  14. logx.MustSetup(c) // logx 根据配置初始化
  15. defer logx.Close() //关闭日志输出
  16. logx.Info("info")
  17. logx.Error("error")
  18. logx.ErrorStack("hello")
  19. logx.Errorf("%s and %s", "hello", "world")
  20. logx.Severef("%s severe %s", "hello", "world")
  21. logx.Slowf("%s slow %s", "hello", "world")
  22. logx.Statf("%s stat %s", "hello", "world")
  23. logx.WithDuration(time.Minute + time.Second).Info("hello")
  24. logx.WithDuration(time.Minute + time.Second).Error("hello")
  25. foo()
  26. }
  1. PS D:\Projects\Github\NoobWu\zero-examples\logging> go run .\logging.go
  2. {"@timestamp":"2021-07-14T21:26:00.520+08","level":"info","content":"info"}
  3. {"@timestamp":"2021-07-14T21:26:00.521+08","level":"error","content":"logging.go:22 error"}
  4. {"@timestamp":"2021-07-14T21:26:00.521+08","level":"error","content":"hello\ngoroutine 1 [running]:\nruntime/debug.Stack(0xdc6000, 0xcea320, 0xc0000da000)\n\tE:/Tools/Go/go-latest/src/runtime/debug/stack.go:24 +0xa5\ngithub.com/tal-tech/go-zero/core/logx.stackSync(0xc00008ea68, 0x5)\n\tG:/Projects/Go/pkg/mod/github.com/tal-tech/go-zero@v1.1.8/core/logx/logs.go:501 +0x45\ngithub.com/tal-tech/go-zero/core/logx.ErrorStack(0xc00010fea0, 0x1, 0x1)\n\tG:/Projects/Go/pkg/mod/github.com/tal-tech/go-zero@v1.1.8/core/logx/logs.go:221 +0x5e\nmain.main()\n\tD:/Projects/Github/NoobWu/zero-examples/logging/logging.go:23 +0x1bd\n"}
  5. {"@timestamp":"2021-07-14T21:26:00.522+08","level":"error","content":"logging.go:24 hello and world"}
  6. {"@timestamp":"2021-07-14T21:26:00.522+08","level":"severe","content":"hello severe world\ngoroutine 1 [running]:\nruntime/debug.Stack(0xdc6000, 0xcea320, 0xc0000da000)\n\tE:/Tools/Go/go-latest/src/runtime/debug/stack.go:24 +0xa5\ngithub.com/tal-tech/go-zero/core/logx.severeSync(0xc00008a990, 0x12)\n\tG:/Projects/Go/pkg/mod/github.com/tal-tech/go-zero@v1.1.8/core/logx/logs.go:485 +0x45\ngithub.com/tal-tech/go-zero/core/logx.Severef(0xcf1f9f, 0xc, 0xc00010fed0, 0x2, 0x2)\n\tG:/Projects/Go/pkg/mod/github.com/tal-tech/go-zero@v1.1.8/core/logx/logs.go:262 +0x72\nmain.main()\n\tD:/Projects/Github/NoobWu/zero-examples/logging/logging.go:25 +0x2c6\n"}
  7. {"@timestamp":"2021-07-14T21:26:00.523+08","level":"slow","content":"hello slow world"}
  8. {"@timestamp":"2021-07-14T21:26:00.523+08","level":"stat","content":"hello stat world"}
  9. {"@timestamp":"2021-07-14T21:26:00.524+08","level":"info","duration":"61000.0ms","content":"hello"}
  10. {"@timestamp":"2021-07-14T21:26:00.525+08","level":"error","duration":"61000.0ms","content":"logging.go:29 hello"}
  11. {"@timestamp":"2021-07-14T21:26:00.526+08","level":"error","duration":"1000.0ms","content":"logging.go:10 world"}

原文链接

https://go-zero.dev/cn/logx.html