Files
zhub/internal/config/config.go

134 lines
3.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package config
import (
"github.com/spf13/viper"
"log"
"net/url"
"os"
"strings"
)
type Log struct {
Handlers string
Level string
File string
}
type Config struct {
Log Log
Service struct {
Watch string
Addr string
Auth bool
}
Data struct {
Dir string
}
Ztimer struct {
Db struct {
Addr string
User string
Password string
Database string
Schema string
Type string
}
}
Auth map[string]string
}
func ReadConfig() Config {
conf := Config{}
viper.SetDefault("log.handlers", "console")
viper.SetDefault("log.level", "info")
viper.SetDefault("service.auth", true)
defer func() {
os.MkdirAll(conf.Data.Dir, os.ModeDir)
}()
/*// 读取指定的配置文件
if !strings.EqualFold("", fileName) {
viper.AddConfigPath(fileName) // 指定配置文件
if err := viper.ReadInConfig(); err == nil {
if err := viper.Unmarshal(&conf); err != nil {
log.Fatalf("Failed to unmarshal config: %s", err.Error())
}
return conf
}
log.Fatalf("Config file not found: " + fileName)
return conf
}*/
// 尝试从 /etc/ 目录下查找 zhub.ini 配置文件
viper.AddConfigPath("/etc/") // 添加 /etc/ 目录作为配置文件搜索路径
viper.SetConfigName("zhub") // 指定配置文件名为 zhub
if err := viper.ReadInConfig(); err == nil {
if err := viper.Unmarshal(&conf); err != nil {
log.Fatalf("Failed to unmarshal config: %s", err.Error())
}
return conf
}
// 如果 /etc/ 目录下未找到配置文件,则尝试从当前程序运行目录下查找 app.ini 配置文件
dir, err := os.Getwd() // 获取程序运行目录
if err != nil {
log.Fatalf("Failed to get current directory: %s", err.Error())
}
viper.SetConfigName("app") // 指定配置文件名为 app
viper.SetConfigType("ini") // 指定配置文件类型为 ini
viper.AddConfigPath(dir) // 添加当前程序所在目录作为配置文件搜索路径
if err := viper.ReadInConfig(); err == nil {
if err := viper.Unmarshal(&conf); err != nil {
log.Fatalf("Failed to unmarshal config: %s", err.Error())
}
// conf.Ztimer.Db.Password 包含 % 做url 转码
if strings.Contains(conf.Ztimer.Db.Password, "%") {
unescape, err := url.QueryUnescape(conf.Ztimer.Db.Password)
if err == nil {
conf.Ztimer.Db.Password = unescape
}
}
return conf
}
// 如果在 /etc/ 目录和当前程序所在目录下均未找到配置文件,则报错
log.Fatalf("Config file not found")
return conf
}
func InitLog(logConfig Log) {
logHandlers := logConfig.Handlers
logLevel := logConfig.Level
logFile := logConfig.File
if logHandlers == "console" {
log.SetOutput(os.Stdout)
} else if logHandlers == "file" {
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_APPEND|os.O_SYNC|os.O_RDWR, 0777)
if err != nil {
log.Println(err)
}
log.SetOutput(file)
} else {
log.SetOutput(os.Stdout)
}
switch logLevel {
case "info":
log.SetFlags(log.LstdFlags | log.Lmicroseconds | log.Lshortfile)
log.SetPrefix("[Info] ")
log.Println("Logger is set up with log level: info")
case "debug":
log.SetFlags(log.LstdFlags | log.Lmicroseconds | log.Lshortfile)
log.SetPrefix("[Debug] ")
log.Println("Logger is set up with log level: debug")
case "error":
log.SetFlags(log.LstdFlags | log.Lmicroseconds | log.Lshortfile)
log.SetPrefix("[Error] ")
log.Println("Logger is set up with log level: error")
default:
log.SetFlags(log.LstdFlags | log.Lmicroseconds | log.Lshortfile)
log.SetPrefix("[Info] ")
log.Println("Logger is set up with default log level: info")
}
}