首页 > 其他分享 >golang配置读取值viper

golang配置读取值viper

时间:2023-05-17 19:48:27浏览次数:57  
标签:log logrus golang viper debug GIN main 取值

viper简介

Viper是Go应用程序的完整配置解决方案,包括12-Factor应用程序。它旨在在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持:

  • 设置默认值
  • JSONTOMLYAMLHCLenvfileJava属性配置文件中读取
  • 实时观看和重新读取配置文件(可选)
  • 从环境变量中读取
  • 从远程配置系统(etcd 或 Consul)读取,并观察变化
  • 从命令行标志读取
  • 从缓冲区读取
  • 设置显式值

读取配置文件

app.yaml

server:
  host: 0.0.0.0
  port: 9090
log:
  level: debug
  format: json

main.go

创建配置文件结构体

var cfg Cfg

type Cfg struct {
  Server Server `yaml:"server"`
  Log    Log    `yaml:"log"`
}
type Server struct {
  Host string `yaml:"host"`
  Port int    `yaml:"port"`
}

type Log struct {
  Level  string `yaml:"level"`
  Format string `yaml:"format"`
}

使用viper读取配置文件并解析到结构体

 1func initConfig() {
 2  viper.AddConfigPath("./")
 3  viper.SetConfigName("apps")
 4  viper.SetConfigType("yaml")
 5  if err := viper.ReadInConfig(); err != nil {
 6    log.Fatalf("read config file failed, %v", err)
 7  }
 8  if err := viper.Unmarshal(&cfg); err != nil {
 9    log.Printf("unmarshal config file failed, %v", err)
10  }
11  log.Printf("%#v", cfg)
12}

设置日志相关参数

 1func initLog() {
 2  switch strings.ToLower(cfg.Log.Level) {
 3  case "panic":
 4    logrus.SetLevel(logrus.PanicLevel)
 5  case "fatal":
 6    logrus.SetLevel(logrus.FatalLevel)
 7  case "error":
 8    logrus.SetLevel(logrus.ErrorLevel)
 9  case "warn", "warning":
10    logrus.SetLevel(logrus.WarnLevel)
11  case "info":
12    logrus.SetLevel(logrus.InfoLevel)
13  case "debug":
14    logrus.SetLevel(logrus.DebugLevel)
15  case "trace":
16    logrus.SetLevel(logrus.TraceLevel)
17  default:
18    logrus.SetLevel(logrus.InfoLevel)
19  }
20  switch strings.ToLower(cfg.Log.Format) {
21  case "json":
22    logrus.SetFormatter(&logrus.JSONFormatter{})
23  case "text":
24    logrus.SetFormatter(&logrus.TextFormatter{})
25  default:
26    logrus.SetFormatter(&logrus.TextFormatter{})
27  }
28}

main函数

1func main() {
2  r := gin.Default()
3  logrus.Debug("i'm a debug log")
4  logrus.Info("i'm a info log")
5  logrus.Warn("i'm a warn log")
6  logrus.Error("i'm a error log")
7  r.Run(cfg.Server.Host + ":" + strconv.Itoa(cfg.Server.Port))
8}

运行

1go run main.go

输出结果

 12021/06/30 10:12:16 main.Cfg{Server:main.Server{Host:"0.0.0.0", Port:9090}, Log:main.Log{Level:"debug", Format:"json"}}
 2[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
 3
 4[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 5 - using env:   export GIN_MODE=release
 6 - using code:  gin.SetMode(gin.ReleaseMode)
 7
 8{"level":"debug","msg":"i'm a debug log","time":"2021-06-30T10:12:16+08:00"}
 9{"level":"info","msg":"i'm a info log","time":"2021-06-30T10:12:16+08:00"}
10{"level":"warning","msg":"i'm a warn log","time":"2021-06-30T10:12:16+08:00"}
11{"level":"error","msg":"i'm a error log","time":"2021-06-30T10:12:16+08:00"}
12[GIN-debug] Listening and serving HTTP on 0.0.0.0:9090

可以看到已经从配置文件读取到配置了。

从环境变量读取配置

1.修改initConfig函数,开启自动注入环境变量功能

在读取配置文件之前使用AutomaticEnv,并使用SetEnvKeyReplacer将".“替换为”" 注:如果是yaml字段有使用到"",可以替换成其他的,或者使用"__"

环境变量的格式为:SERVER_PORT

1...
2  viper.SetConfigType("yaml")
3  viper.AutomaticEnv()
4  replacer := strings.NewReplacer(".", "_")
5  viper.SetEnvKeyReplacer(replacer)
6  if err := viper.ReadInConfig(); err != nil {
7...

2.运行测试

1SERVER_PORT=10086 go run main.go
 12021/06/30 15:45:19 main.Cfg{Server:main.Server{Host:"", Port:10086}, Log:main.Log{Level:"debug", Format:"json"}}
 2[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
 3
 4[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 5 - using env:	export GIN_MODE=release
 6 - using code:	gin.SetMode(gin.ReleaseMode)
 7
 8{"level":"debug","msg":"i'm a debug log","time":"2021-06-30T15:45:19+08:00"}
 9{"level":"info","msg":"i'm a info log","time":"2021-06-30T15:45:19+08:00"}
10{"level":"warning","msg":"i'm a warn log","time":"2021-06-30T15:45:19+08:00"}
11{"level":"error","msg":"i'm a error log","time":"2021-06-30T15:45:19+08:00"}
12[GIN-debug] Listening and serving HTTP on :10086

看到端口已经自动变成10086了。

修改日志相关变量

1LOG_LEVEL=info LOG_FORMAT=text go run viper.go

可以看到日志级别和日志格式已经为环境变量指定的了。

 12021/06/30 15:46:50 main.Cfg{Server:main.Server{Host:"", Port:9090}, Log:main.Log{Level:"info", Format:"text"}}
 2[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
 3
 4[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 5 - using env:	export GIN_MODE=release
 6 - using code:	gin.SetMode(gin.ReleaseMode)
 7
 8INFO[0000] i'm a info log
 9WARN[0000] i'm a warn log
10ERRO[0000] i'm a error log
11[GIN-debug] Listening and serving HTTP on :9090

标签:log,logrus,golang,viper,debug,GIN,main,取值
From: https://www.cnblogs.com/xingxia/p/golang_viper.html

相关文章

  • 成品直播源码,golang计算时间段内的工作日数量
    成品直播源码,golang计算时间段内的工作日数量 packagemainimport("fmt""time")funcmain(){start,_:=time.Parse("2006-01-02","2021-10-01")end,_:=time.Parse("2006-01-02","2021-10-31")total,days:=CalcWorkH......
  • Golang基础-字节跳动青训营
    Golang安装访问https://go.dev/,点击Download,下载对应平台安装包,安装即可如果无法访问上述网址,可以改为访问https://studygolang.com/dl下载安装如果访问github速度比较慢,建议配置gomodproxy,参考https://goproxy.cn/里面的描述配置,下载第三方依赖包的速度可以大......
  • Golang接收者方法语法糖
    1、概述在《Golang常用语法糖》这篇博文中我们讲解Golang中常用的12种语法糖,在本文我们主要讲解下接收者方法语法糖。在介绍Golang接收者方法语法糖前,先简单说下Go语言的指针(Pointer),大致上理解如下:变量名前的& 符号,是取变量的内存地址,不是取值;数据类型前的* 符号,代表......
  • golang vrrp + ipvs 实现简单的服务ha
    比较类似keeplived,但是是比较简单的集成参考图基于vrrp实现vip的处理,同时master以及backup安装基于vrrp+ipvs的程序,基于服务状态进行服务的切换处理 实现说明:对于vrrp处理可以基于包装的vrrpgolang(rongfengliang/vrrp)包,同时对于ipvs可以直接ipvs包(可以使用mqli......
  • Golang URL query contains semicolon 报错解决方案
    ​ 报错信息http:URLquerycontainssemicolon,whichisnolongerasupportedseparator;partsofthequerymaybestrippedwhenparsed;seegolang.org/issue/25192 高版本http废除了分号做分隔符,会在http库中做报警输出,基础库代码如下:func(shserverHandle......
  • golang 关于 Inf,-Inf,Infinity,-Infinity 等无穷大无穷小特殊字符转换问题
    记录一个比较个例的问题,某天API突然写入数据失败,原因是数据库写入长度超出,并且从日志中发现了"Infinity"这样的特殊字符串英语渣渣的我有懵,客户端发过来的数据,API都会转换为对应的数据类型,再进行数据库写入,如果是字符串,最多就转成0,怎么会长度超出万变不离其宗,肉眼看不出的问题......
  • Golang基础--context的用法
    context包是go并发中常用的包,用于设置截至日期,同步信号,传递请求相关的值。应用场景每一个http请求的request都会启动一个goroutine处理这个请求,后续跟进的这个请求可能还需要访问数据库,做安全验证,访问控制,日志记录等,这时候就会由最早的goroutine启动后续的多个goroutine,这......
  • Golang后端研发岗位的面试笔记整理
    今年互联网行情真不太行,暑期实习投了十几家,在经历了各种一面挂和二面挂后,终于在最后拿到了百度的暑期实习offer,真的不容易,中间一度被面试搞得怀疑人生,太难了QAQ这是本人花了点时间整理的一些与Golang后端研发岗位相关的面试笔记,欢迎大家及时补充当然并不局限于Golang研发岗位,......
  • golang vrrp 包
    vrrp是一个比较有用的功能,可以实现业务访问的的高可用,keepalived就使用了此协议(当然还集成了lvs)此包是基于了社区提供的VRRP-go包调整的,解决了一些问题:比如不是gomod的,部分依赖三方包不兼容参考使用gomod gomodinitgithub.com/rongfengliang/demoappv......
  • golang多版本管理工具g
    一、golang多版本管理工具g 一)g简介g是一个Linux、macOS、Windows下的命令行工具,可以提供一个便捷的多版本go环境的管理和切换 二)g特性支持列出可供安装的go版本号支持列出已安装的go版本号支持在本地安装多个go版本支持卸载已安装的go版本支持在已安装的go版本......