如何搭建golang框架-创新互联

本文在介绍关于搭建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框架的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站栏目:如何搭建golang框架-创新互联
本文URL:http://hbruida.cn/article/dcscod.html