下面是“详解Go语言中配置文件使用与日志配置”的完整攻略。
一、配置文件使用
1.1 配置文件类型
Go语言中常用的配置文件类型有ini、json、yaml等,以ini文件为例。Ini配置文件是一种常用的配置文件,可以用于存储配置参数,由多个节组成,每个节包含多个键值对。ini配置文件的一般格式如下:
[section1]
key1=value1
key2=value2
[section2]
key3=value3
key4=value4
1.2 读取配置文件
Go语言中可以使用第三方库viper来读取ini配置文件。使用viper库可以实现跨平台,自动绑定环境变量和命令行参数等功能,使用起来非常便捷。
在开始使用viper之前,需要安装viper并导入相关包:
import (
"fmt"
"github.com/spf13/viper"
)
接下来,可以使用以下代码读取配置文件:
func main() {
// 设置配置文件所在的文件夹路径和名称
viper.SetConfigName("config")
viper.AddConfigPath("./config")
// viper默认支持读取环境变量和命令行参数,可以自动绑定
viper.AutomaticEnv()
// 读取配置文件
err := viper.ReadInConfig()
if err != nil {
panic(fmt.Errorf("读取配置文件失败:%s", err))
}
// 读取配置参数
addr := viper.GetString("server.addr")
port := viper.GetInt("server.port")
// 输出配置参数
fmt.Printf("服务地址:%s,端口:%d", addr, port)
}
以上代码会自动在config文件夹中查找名为config.ini的配置文件,并读取其中的server.addr和server.port参数。如果并没有找到该文件,则会报错。
1.3 示例说明
示例1:读取配置文件中的MySQL数据库连接信息
假设我们有一个config.ini配置文件,其中存储了MySQL数据库的连接信息,格式如下:
[mysql]
user = root
password = root
host = localhost
port = 3306
database = test
可以使用以下代码读取上面的配置文件:
// 设置配置文件所在的文件夹路径和名称
viper.SetConfigName("config")
viper.AddConfigPath("./config")
// viper默认支持读取环境变量和命令行参数,可以自动绑定
viper.AutomaticEnv()
// 读取配置文件
err := viper.ReadInConfig()
if err != nil {
panic(fmt.Errorf("读取配置文件失败:%s", err))
}
// 读取配置参数
user := viper.GetString("mysql.user")
password := viper.GetString("mysql.password")
host := viper.GetString("mysql.host")
port := viper.GetInt("mysql.port")
database := viper.GetString("mysql.database")
// 输出配置参数
fmt.Printf("MySQL连接信息:%s:%s@tcp(%s:%d)/%s", user, password, host, port, database)
示例2:读取配置文件中的邮件发送信息
假设我们有一个config.ini配置文件,其中存储了邮件发送的相关信息,格式如下:
[mail]
host = smtp.qq.com
port = 465
user = example@qq.com
password = examplepassword
from = example@qq.com
to = example2@qq.com
可以使用以下代码读取上面的配置文件:
// 设置配置文件所在的文件夹路径和名称
viper.SetConfigName("config")
viper.AddConfigPath("./config")
// viper默认支持读取环境变量和命令行参数,可以自动绑定
viper.AutomaticEnv()
// 读取配置文件
err := viper.ReadInConfig()
if err != nil {
panic(fmt.Errorf("读取配置文件失败:%s", err))
}
// 读取配置参数
host := viper.GetString("mail.host")
port := viper.GetInt("mail.port")
user := viper.GetString("mail.user")
password := viper.GetString("mail.password")
from := viper.GetString("mail.from")
to := viper.GetString("mail.to")
// 输出配置参数
fmt.Printf("邮件发送信息:主机:%s,端口:%d,用户:%s,发送者:%s,接收者:%s", host, port, user, from, to)
二、日志配置
2.1 日志库的选择
Go语言中有很多优秀的日志库,常用的有logrus、zap等。这里以logrus为例进行讲解。
2.2 日志等级
一般来说,日志等级分为以下几个等级:
- Trace
- Debug
- Info
- Warn
- Error
- Fatal
- Panic
其中,Trace最低级别,Panic最高级别,具体使用根据实际情况来确定。
2.3 日志格式
在输出日志时,可以采用不同的输出格式,如JSON、YAML、Text等。一般来说,JSON格式方便日志的处理和分析,另外Text格式更加人性化。
2.4 日志输出位置
日志可以输出到不同的位置,例如控制台、文件、网络等,这里以控制台和文件为例进行讲解。
2.5 配置文件
使用logrus进行日志输出时,可以使用第三方库viper来读取配置文件,配置文件格式如下:
[log]
# 日志等级
level = debug
# 输出位置(console/file)
output = console
# 日志文件路径(当输出位置为文件时)
file = logs/app.log
# 日志打印格式(json/text)
format = text
2.6 日志配置
接下来,可以使用以下代码进行日志的配置:
func main() {
// 设置配置文件所在的文件夹路径和名称
viper.SetConfigName("config")
viper.AddConfigPath("./config")
// viper默认支持读取环境变量和命令行参数,可以自动绑定
viper.AutomaticEnv()
// 读取配置文件
err := viper.ReadInConfig()
if err != nil {
panic(fmt.Errorf("读取配置文件失败:%s", err))
}
// 配置日志记录器
logLevel, _ := logrus.ParseLevel(viper.GetString("log.level"))
logrus.SetLevel(logLevel)
if viper.GetString("log.output") == "console" {
// 输出到控制台
logrus.SetOutput(os.Stdout)
} else if viper.GetString("log.output") == "file" {
// 输出到文件
logFile, err := os.OpenFile(viper.GetString("log.file"), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err == nil {
logrus.SetOutput(logFile)
} else {
logrus.Info("Failed to log to file, using default stderr")
}
} else {
logrus.Info("Invalid log output type")
}
// 配置日志格式
if viper.GetString("log.format") == "json" {
logrus.SetFormatter(&logrus.JSONFormatter{})
} else if viper.GetString("log.format") == "text" {
logrus.SetFormatter(&logrus.TextFormatter{})
} else {
logrus.Info("Invalid log format type")
}
// 输出日志
logrus.WithFields(logrus.Fields{
"module": "main",
}).Info("应用启动成功")
}
以上代码会自动在config文件夹中查找名为config.ini的配置文件,并读取其中的log.level、log.output、log.file和log.format参数,然后进行相应的日志配置。
2.7 示例说明
示例3:记录HTTP服务器的访问日志
假设我们有一个HTTP服务器,并且需要记录所有客户端的访问信息,包括请求的URL、客户端IP地址、请求的User-Agent等。可以使用logrus库来实现这一功能。
首先,需要安装logrus库并导入相关包:
import (
"net/http"
"github.com/sirupsen/logrus"
)
然后,可以使用以下代码实现日志记录:
func main() {
// 设置配置文件所在的文件夹路径和名称
viper.SetConfigName("config")
viper.AddConfigPath("./config")
// viper默认支持读取环境变量和命令行参数,可以自动绑定
viper.AutomaticEnv()
// 读取配置文件
err := viper.ReadInConfig()
if err != nil {
panic(fmt.Errorf("读取配置文件失败:%s", err))
}
// 配置日志记录器
logLevel, _ := logrus.ParseLevel(viper.GetString("log.level"))
logrus.SetLevel(logLevel)
if viper.GetString("log.output") == "console" {
// 输出到控制台
logrus.SetOutput(os.Stdout)
} else if viper.GetString("log.output") == "file" {
// 输出到文件
logFile, err := os.OpenFile(viper.GetString("log.file"), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err == nil {
logrus.SetOutput(logFile)
} else {
logrus.Info("Failed to log to file, using default stderr")
}
} else {
logrus.Info("Invalid log output type")
}
// 配置日志格式
if viper.GetString("log.format") == "json" {
logrus.SetFormatter(&logrus.JSONFormatter{})
} else if viper.GetString("log.format") == "text" {
logrus.SetFormatter(&logrus.TextFormatter{})
} else {
logrus.Info("Invalid log format type")
}
// 启动HTTP服务器
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
logrus.WithFields(logrus.Fields{
"ip": r.RemoteAddr,
"useragent": r.UserAgent(),
"url": r.URL,
"method": r.Method,
}).Info("HTTP请求")
w.Write([]byte("Hello World!"))
})
err = http.ListenAndServe(":8080", nil)
if err != nil {
logrus.WithError(err).WithFields(logrus.Fields{
"module": "main",
}).Error("服务器监听启动失败")
} else {
logrus.WithFields(logrus.Fields{
"module": "main",
}).Info("服务器监听启动成功")
}
}
示例中,日志输出到控制台,并记录客户端的访问信息,当发生错误时,会将错误记录到日志中。服务器监听启动后,访问http://localhost:8080即可看到Hello World!的输出,并在控制台上看到相应的日志信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Go语言中配置文件使用与日志配置 - Python技术站