重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本文在介绍关于搭建golang框架的基础上,重点探讨了初始化日志、配置入口文件以及测试文件的方法,步骤简单易上手操作,文章内容步步紧凑,希望大家根据这篇文章可以有所收获。
创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、网站建设、外贸营销网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的会昌网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
入口文件
func main() {
config.InitConfig()
logger.InitLogger()
}
暂且忽略一些实现细节,我们需要先初始化配置和日志,先来看看日志,我选用Uber的zap日志库。来看看日志模块怎么写?
package logger
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)
var l *zap.Logger
func InitLogger(logPath, logLevel string) error {
hook := lumberjack.Logger{
Filename: logPath,
MaxSize: 1024,
MaxBackups: 3,
MaxAge: 7,
Compress: true,
}
w := zapcore.AddSync(&hook)
var level zapcore.Level
switch logLevel {
case "debug":
level = zap.DebugLevel
case "info":
level = zap.InfoLevel
case "error":
level = zap.ErrorLevel
default:
level = zap.DebugLevel
}
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
core := zapcore.NewCore(
zapcore.NewConsoleEncoder(encoderConfig),
w,
level,
)
l = zap.New(core)
return nil
}
func GetLogger() *zap.Logger {
return l
}
我们先定义一个包级的全局变量l,类型是*zap.Logger,并创建了InitLogger和GetLogger这两个函数。因为,zap不支持日志归档,所以在InitLogger中定义了一个lumberjack的hook,用来归档日志。我们可以看到InitLogger这个方法有两个入参:logPath和logLevel。一般来讲,这些参数应该是放在配置文件里的,接下来我们来写配置。
我们简单地创建一个config.json文件来存放配置:
config.json:
{
"log_config": {
"log_path": "{your_path}",
"log_level": "debug"
}
}
然后在config.go中创建相应的结构体,之后定义InitConfig和GetConfig方法,在InitConfig方法中,我读取了配置文件的内容,然后解析到结构体中,并处理了错误,如果有错误信息的话,我会将错误信息包裹一层,方便以后的错误定位。InitConfig有一个入参,就是配置文件的路径,这个参数我会从命令行中获取。
config.go:
package config
import (
"encoding/json"
"github.com/pkg/errors"
"io/ioutil"
)
type LogConfig struct {
LogPath string `json:"log_path"`
LogLevel string `json:"log_level"`
}
type Config struct {
LogConfig LogConfig `json:"log_config"`
}
var conf Config
func InitConfig(configPath string) error {
configFile, err := ioutil.ReadFile(configPath)
if err != nil {
err = errors.Wrap(err, "Read config file failed.")
return err
}
err = json.Unmarshal(configFile, &conf)
if err != nil {
err = errors.Wrap(err, "Unmarshal config file failed.")
return err
}
return nil
}
func GetConfig() Config {
return conf
}
我们当然不止这么一点配置,我们还有数据库、缓存等配置没有添加,但不急,我们先理出一个路线,之后的配置可以依葫芦画瓢。
好,日志和配置的初始化大致写好了,我们回过头来看一下入口文件的调整:
package main
import (
"flag"
"fmt"
"github.com/TomatoMr/awesomeframework/config"
"github.com/TomatoMr/awesomeframework/logger"
"os"
)
func main() {
var configPath string
flag.StringVar(&configPath, "config", "", "配置文件路径")
flag.Parse()
if configPath == "" {
fmt.Printf("Config Path must be assigned.")
os.Exit(1)
}
var err error
err = config.InitConfig(configPath)
if err != nil {
fmt.Printf("Init config failed. Error is %v", err)
os.Exit(1)
}
logConfig := config.GetConfig().LogConfig
err = logger.InitLogger(logConfig.LogPath, logConfig.LogLevel)
if err != nil {
fmt.Printf("Init logger failed. Error is %v", err)
os.Exit(1)
}
logger.GetLogger().Info("Init success.")
}
我们调整了入口文件,从命令行里获取配置文件路径,之后初始化了配置和日志,最后打印初始化结果。
首先,编译一下:
$ go build
接着修改一下你的config.json文件的log_path,然后在命令行指定一下你的配置文件路径:
$ awesomeframework --config={$your_path}/config.json
最后,来看一下运行正不正常,日志文件的打印如下:
2020-01-19T20:41:57.506+0800 info Init success.
看完上述内容,你们掌握搭建golang框架的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!