如何搭建golang框架
admin
2023-02-16 02:40:04
0

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

相关内容

热门资讯

馆校合作丨南充科技馆走进仪陇县... 馆校合作 南充科技馆走进 NCSTM 仪陇县实验学校 天府科普研学游 4月29日上午,南充科技馆科普...
我国本土发现的首块月球陨石有重... 我国本土发现的首块月球陨石揭示了月球两次关键地质事件,并发现一种月球新矿物。 2026年世界地球日,...
马斯克的GPU也在摸鱼?狂囤几... 新智元报道 编辑:元宇 【新智元导读】马斯克囤了几十万张卡,结果只跑了11%?据媒体报道,xAI的...
原创 特... 4月24日,白宫以总统人事办公室的名义,向美国国家科学委员会的22名在任委员群发了一封冷冰冰的电子邮...
以军总参谋长:若伊朗袭击以色列... △以色列国防军总参谋长扎米尔(资料图)当地时间5月5日,以色列国防军总参谋长扎米尔表示,如果伊朗在海...
神龙拜耳光伏有限公司生产支架 光伏支架,到底“支”起了什么? 提到光伏电站,很多人第一反应是那一块块深蓝色的电池板。但真正让这些电...
食品级制冰袋厂家选型指南:上海... 导语:在餐饮、物流、医药等行业中,制冰袋作为低温保鲜的核心耗材,其性能稳定性直接影响产品品质与运营效...
南通崇川发放首笔“算力券”补贴 购买、领券、付款……近日,随着在南通市公共算力服务平台算力超市完成中国移动算力服务的租用下单操作,江...
百万上下文之后,拼什么? 文 | 科技不许冷 过去几天,科技圈的视线全被DeepSeek吸走了。 满屏都是传闻中的估值溢价,...
成语之都 好玩邯郸丨邯山区AI... (来源:邯郸新闻网) 转自:邯郸新闻网 近日,在邯山区科技创新产业园内的邯郸人工智能教育基地,一拨拨...