package config import ( "log" "os" "github.com/spf13/viper" "gopkg.in/ini.v1" ) type Log struct { Handlers string `ini:"handlers"` Level string `ini:"level"` File string `ini:"file"` } type Config struct { Log Log `ini:"log"` Service struct { Watch string `ini:"watch"` Addr string `ini:"addr"` Auth bool `ini:"auth"` } `ini:"service"` Data struct { Dir string `ini:"dir"` } `ini:"data"` Ztimer struct { Db struct { Addr string `ini:"addr"` User string `ini:"user"` Password string `ini:"password"` Database string `ini:"database"` Schema string `ini:"schema"` Type string `ini:"type"` } `ini:"db"` } `ini:"ztimer"` Auth map[string]string `ini:"auth"` } 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 } else { log.Fatalf("Config file not found: " + err.Error()) }*/ load, err := ini.Load("app.ini") if err != nil { log.Panicf("Failed to load config: %s", err.Error()) } load.MapTo(&conf) 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") } }