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}

Copy

设置日志相关参数

 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}

Copy

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}

Copy

运行

1go run main.go

Copy

输出结果

 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

Copy

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

从环境变量读取配置

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...

Copy

2.运行测试

1SERVER_PORT=10086 go run main.go

Copy

 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

Copy

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

修改日志相关变量

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

Copy

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

 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


golang配置读取值viper的更多相关文章

  1. Golang项目的配置管理——Viper简易入门配置

    Golang项目的配置管理--Viper简易入门配置 What is Viper? From:https://github.com/spf13/viper Viper is a complete co ...

  2. Viper--方便好用的Golang 配置库

    前言 本文主要是为读者介绍一个轻便好用的Golang配置库viper 正文 viper 的功能   viper 支持以下功能:   1. 支持Yaml.Json. TOML.HCL 等格式的配置   ...

  3. MFC 全局配置 读取保存配置

    不知道关于全局配置别人都是怎么处理的,最近做的东西都用到全局配置,而且要保存软件的设置,下次启动时要使用上次关闭时的配置. 我的做法是建一个类用来保存和读取配置,并且在这个类中创建一些变量,供所有的界 ...

  4. springcloud config配置读取优先级

    情景描述 最近在修复Eureka的静态页面加载不出的缺陷时,最终发现是远程GIT仓库将静态资源访问方式配置给禁用了(spring.resources.add-mappings=false).虽然最后直 ...

  5. 外部配置属性值是如何被绑定到XxxProperties类属性上的?--SpringBoot源码(五)

    注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 前言 本篇接 SpringBoot是如何实现自动配置的?--SpringBoot源码(四) 温故而知新,我们来简单回顾一下上 ...

  6. .NET Core技术研究-配置读取

    升级ASP.NET Core后,配置的读取是第一个要明确的技术.原先的App.Config.Web.Config.自定义Config在ASP.NET Core中如何正常使用.有必要好好总结整理一下,相 ...

  7. spring boot下为配置属性值加密的正确姿势

    最近做电商系统,安全性要求比较高,针对配置属性值的加密自然也是需要增强的点之一,那么如何加密呢? 网上搜索了些,有jasypt加密mysql密码的最为普遍,可惜问题就在于只能加密mysql信息,其他的 ...

  8. SpringBoot基础学习(二) SpringBoot全局配置文件及配置文件属性值注入

    全局配置文件 全局配置文件能够对一些默认配置值进行修改.SpringBoot 使用一个名为 application.properties 或者 application.yaml的文件作为全局配置文件, ...

  9. golang在win10安装、环境配置 和 goland(IDE开发golang配置)

    前言 本人在使用goland软件开发go时,对于goland软件配置网上资料少,为了方便自己遗忘.也为了希望和我一样的小白能够更好的使用,所以就写下这篇博客,废话不多说开考. 一.查看自己电脑系统版本 ...

  10. ASP.NET Core - 配置系统之配置读取

    一个应用要运行起来,往往需要读取很多的预设好的配置信息,根据约定好的信息或方式执行一定的行为. 配置的本质就是软件运行的参数,在一个软件实现中需要的参数非常多,如果我们以 Hard Code(硬编码) ...

随机推荐

  1. opencv colors

    """ 在利用python进行画图时,我们可能常常用的颜色就是'k'黑色,'r'红色,'b'蓝色,'g'绿色等,这些颜色分别代表常见的 几种颜色.但是当我们画图比较多时, ...

  2. Nuxt Kit 的使用指南:模块创建与管理

    title: Nuxt Kit 的使用指南:模块创建与管理 date: 2024/9/11 updated: 2024/9/11 author: cmdragon excerpt: 摘要:本文是关于N ...

  3. 即构 UIKits 重磅发布!高效开发与自定义UI兼备,打造互动场景新标杆

    即构UIKits上线,新一代场景化实时互动SDK! 即构科技发布了首款面向中小团队的整合型实时互动产品UIKits , 基于场景化最佳实践,整合RTC.IM.直播.美颜等多款产品,打造了音视频通话UI ...

  4. TypeScript 学习笔记 – Handbook 1

    前言 一转眼, 一年多没有写 TypeScript 了. 最近又要开始写了, 乘此机会打算系统学习一下, 顺便写一个学习笔记. 我接触 TypeScript 比较早, 那是 Angular 2 bet ...

  5. SQL Server – 冷知识 (新手)

    前言 没有系统化学一本语言或技术, 那便会被一些冷知识坑. 这里做些记入. 变量作用域 SQL 是远古语法, 声明变量在最顶部就是一条上古法则. 如果我看见有了用这个法则写 C# 或 JS 我就会杀了 ...

  6. CSP-J 2024游记

    CSP-J 2024游记 题目难度 总体来说,这次考试题目对于我这个初一牲难度不高.前面的选择题出现了少量难题(格蕾码). 选择题 选择题出现了一个搞人心态的BYD题目--格蕾码.这道题我蒙的, 阅读 ...

  7. 原生CSS、HTML 和 JavaScript 实现酷炫表单

    一直使用 Vue/React ,习惯了用组件,偶尔想用原生三剑客写点 Demo 发现样式丑的不忍直视.最近看 掘金小册<玩转CSS的艺术之美>看到 CSS 相关的内容,发现原生 CSS 也 ...

  8. 2023年5月中国数据库排行榜:OTO组合回归育新机,华为高斯蓄势待发展雄心

    路漫漫其修远兮,吾将上下而求索. 2023年5月的 墨天轮中国数据库流行度排行 火热出炉,本月共有262个数据库参与排名.本月排行榜前十变动较大,可以用一句话概括为:openGauss 立足创新夺探花 ...

  9. 墨天轮访谈 | 腾讯张铭:带你揭秘王者荣耀背后的游戏数据库 TcaplusDB

    分享嘉宾:张铭 腾讯数据库专家工程师,TcaplusDB产品负责人 整理:墨天轮社区 导读 大家好,我是腾讯TcaplusDB的产品负责人张铭,TcaplusDB是专为游戏设计的分布式 NoSQL 数 ...

  10. 如何解决使用 router.push 跳转路由第二次之后页面就不会刷新了

    router.push({ name:"monitor", query:{ deviceid:"1676156672197922816", // 设备 ID i ...