6、实现日志打印功能

打印日志需要一个日志包,日志包的选择通常有以下几种手段

  • 自研:根据需要从0自研一个日志包
  • 复用团队/公司基本的日志包:更多的情况,是复用公司级别的日志包
  • 复用开源日志包:如sirupsen/logrusuber-go/zap

go标准库也自带了一个生产可用的日志包log/slog

Go代码使用日志包的步骤

  1. 初始化日志包
  2. 调用日志包
步骤一:初始化日志包

修改cmd/fg-apiserver/server.go文件

func initLog() {
	format := viper.GetString("log.format") // 日志格式,支持:json、text
	level := viper.GetString("log.level")   // 日志级别,支持:debug、info、warn、error
	output := viper.GetString("log.output") // 日志输出路径,支持:标准输出stdout和文件
	// 转换日志级别
	var slevel slog.Level
	switch level {
	case "debug":

		slevel = slog.LevelDebug
	case "info":

		slevel = slog.LevelInfo
	case "warn":
		slevel = slog.LevelWarn
	case "error":
		slevel = slog.LevelError
	default:
		slevel = slog.LevelInfo
	}
	opts := &slog.HandlerOptions{Level: slevel}
	var w io.Writer
	var err error
	// 转换日志输出路径
	switch output {
	case "":
		w = os.Stdout
	case "stdout":
		w = os.Stdout
	default:
		w, err = os.OpenFile(output, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
		if err != nil {
			panic(err)
		}

	}

	// 转换日志格式
	if err != nil {
		return
	}
	var handler slog.Handler
	switch format {
	case "json":
		handler = slog.NewJSONHandler(w, opts)
	case "text":
		handler = slog.NewTextHandler(w, opts)
	default:
		handler = slog.NewJSONHandler(w, opts)
	}
	slog.SetDefault(slog.New(handler))
}
func run(opts *options.ServerOptions) error {
...
        // 初始化slog
	initLog()



...

}
步骤二:调用日志包

在internal/apiserver/server.go 中,将输入改成调用slog日志包来输出。

func (s *Server) Run() error {
	slog.Info(fmt.Sprintf("Read MYSQL host from config %s", s.cfg.MYSQLOptions.Addr))
	//select {} // 调用select 语句,阻塞防止进程退出
	return nil
}

slog包还提供了Debug、warn、Error等方法,用来打印不同级别的日志

编译并运行

1、更新配置文件

更新config/fg-apiserver.yaml

# Mysql数据库相关配置
mysql:
  # MYSQL 机器ip和端口,默认127.0.0.1:3306
  addr: 127.0.0.1:3306
  # mysql用户名
  username: fastgo
  # mysql密码
  password: fastgo1234
  # 数据库名
  database: fastgo
  # 最大空闲连接数,默认100
  max-idle-connections: 100
  # 最大打开链接数
  max-open-connections: 100
  # 空闲连接最大存活时间
  max-connection-life-time: 10s

log:
  format: json
  level: info
  output: stdout
#  output: ./log/fg-apiserver-info.log 输出到文件中

2、编译并运行

(base) dujie@MacBook-Pro fastgo % sh build.sh 
command-line-arguments
(base) dujie@MacBook-Pro fastgo % ./_output/fg-apiserver -c configs/fg-apiserver.yaml
/Users/dujie/.fastgo/fg-apiserver.yaml

image